实现例子由两个界面组成
A B 两个视图
A - > B 使用属性传值
B - > A 使用闭包进行反向回调传值
Swift 使用闭包传值的原理,与OC 中使用代码块(block)传值原理,基本类似
按步骤可以如下理解:
1、定义闭包。
2、闭包赋值(传送)
3、闭包调用。
想对于当前界面上执行某个操作,就在当前界面上定义,
比如:我想通过 B 界面回调 给 A 界面上的label赋值,赋值操作是在 A 界面上执行的、那么闭包就应该定义在 A 界面上。既然定义在 A ,那么 B 界面就是调用闭包的地方。找准实现者,跟调用者,然后在调用者界面定义属性用于接收闭包即可;
实现代码:
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
} ()
// 懒加载方法添加 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()
// 属性传值 赋值
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)
}
}
import UIKit
class SecViewController: UIViewController {
// 属性传值 定义变量
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)
}
}