實現例子由兩個界面組成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) }}