Swift 閉包傳值

實現例子由兩個界面組成html

A  B 兩個視圖
A - > B 使用屬性傳值
B - > A 使用閉包進行反向回調傳值閉包

Swift 使用閉包傳值的原理,與OC 中使用代碼塊(block)傳值原理,基本相似ide

按步驟能夠以下理解:
一、定義閉包。
二、閉包賦值(傳送)
三、閉包調用。orm

想對於當前界面上執行某個操做,就在當前界面上定義,
好比:我想經過 B 界面回調 給 A 界面上的label賦值,賦值操做是在 A 界面上執行的、那麼閉包就應該定義在 A 界面上。既然定義在 A ,那麼 B 界面就是調用閉包的地方。找準實現者,跟調用者,而後在調用者界面定義屬性用於接收閉包便可;htm

實現代碼:get

import UIKit

class ViewController: UIViewController {
    
    // 懶加載添加 btn
    lazy var btn:UIButton = {
        let button = UIButton(frame: CGRectMake(100, 200, 100, 30))
        button.backgroundColor = UIColor.redColor()
        button.addTarget(self, action: "btnAction:", forControlEvents: UIControlEvents.TouchUpInside)
        button.setTitle("點擊跳轉頁面", forState: UIControlState.Normal)
        return button
    } ()it

  // 懶加載方法添加 label
    lazy var label:UILabel = {
        let lab = UILabel(frame: CGRectMake(100, 100, 100, 30))
        lab.backgroundColor = UIColor.yellowColor()
        return lab
    } ()
    
    // btn 實現方法
    func btnAction(btn:UIButton) {
        let secVC = SecViewController()io

// 屬性傳值 賦值
        secVC.str = label.text
        
        // 接收傳過來的值
        secVC.sendValue = {
            (str: String)-> () in
            self.label.text = str
        }
        // present 到 B 界面
        self.presentViewController(secVC, animated: true, completion: nil)
    }
   
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.addSubview(btn)
        
        view.addSubview(label)
        
    }
}class

 

import UIKit

class SecViewController: UIViewController {import

 // 屬性傳值 定義變量
    var str:String?


    // 變量:類型  此處類型是個閉包
    var sendValue:((str:String)->())?
    
    // 懶加載添加 textfield
    lazy var textField:UITextField = {
        let tf = UITextField(frame: CGRectMake(100, 100, 100, 30)) 

 // 屬性傳值 取值        tf.text = self.str               tf.backgroundColor = UIColor.yellowColor()        return tf    } ()        // 懶加載添加 btn    lazy var button:UIButton = {        let btn = UIButton(frame: CGRectMake(100, 200, 100, 30))        btn.setTitle("back", forState: UIControlState.Normal)        btn.addTarget(self, action: "back", forControlEvents: UIControlEvents.TouchUpInside)        return btn    } ()        // btn實現方法    func back() {        // 調用        if sendValue != nil {           sendValue!(str: textField.text!)         }                self.dismissViewControllerAnimated(true, completion: nil)    }    override func viewDidLoad() {        super.viewDidLoad()        view.addSubview(textField)                view.addSubview(button)    }}

相關文章
相關標籤/搜索