前言
本文章主要介绍如何在 VC
之间进行 正向传值、反向传值
正向传值
1 2 3 4 5 6
| // 定义一个属性并初始化 let nextVC: NextViewController = NextViewController()
// 正向传值 nextVC.name = "张建"; self.present(nextVC, animated: true)
|
1 2
| // 正向传值,接收方 var name: String?
|
反向传值
反向传值的方式有以下几种:delegate、闭包、KVO
和 NOtification
四种方式
- delegate
delegate
只能 一对一
。
1 2 3 4 5
| // 定义协议 protocol NextDelegate { // 定义一个方法 返回年龄 func clickBtn(age: Int) -> Void }
|
1 2
| // 定义delegate var delegate: NextDelegate?
|
1 2 3 4 5 6 7
| // 点击按钮的事件 @objc func clickBtn(sender: UIButton) { // 代理回传数据 delegate?.clickBtn(age: 32) self.dismiss(animated: true); }
|
1 2 3 4 5
| // 遵循协议 class ViewController: UIViewController,NextDelegate
// 设置代理 nextVC.delegate = self
|
1 2 3 4
| // 实现代理回调方法 func clickBtn(age: Int) { print(age) }
|
- 闭包
1 2
| // 定义一个闭包 var passBlockValue:((_ sex:String) -> Void)?
|
1 2
| // 闭包回传数据 passBlockValue!("男")
|
1 2 3 4
| // 接收block传值 nextVC.passBlockValue = { value in print(value) }
|
- KVO
KVO
可以用来监听 自定义类
里面的属性,这个类需要继承 NSObject
并 dynamic
修饰,例如:我们创建一个 Person
类,监听属性 name
- 创建
Person
类型,并定义一个属性 name
1 2 3 4
| class Person: NSObject { // dynamic修饰可支持KVO @objc dynamic var name: String = "张三" }
|
1 2
| // 定义一个全局的person let p: Person = Person()
|
1 2
| // 添加监听 p.addObserver(self, forKeyPath: "name",options: [.old,.new], context: nil)
|
1 2
| // 改变person的属性name p.name = "李四"
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| // 监听对象属性发送变化,自动调用该函数 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { let oldName = change![NSKeyValueChangeKey.oldKey] if let oldName = oldName { print(oldName) // 张三 } let newName = change![NSKeyValueChangeKey.newKey] if let newName = newName { print(newName) // 李四 } }
|
1 2 3 4 5
| // 析构函数 deinit { // 移除监听:add和remove必须成对出现,否则报错 p.removeObserver(self, forKeyPath: "name", context: nil) }
|
- NOtification
通知
是可以 一对多的
,通常用于不相邻两个页面之间的 传值
1 2 3 4 5 6
| // 发送通知 // 发送简单的数据 // NotificationCenter.default.post(name: NSNotification.Name(rawValue:"SimpleNotification"), object: "hello") // 发送复杂的数据 let userInfo = ["name":"ZJ","age":32] as [String:Any] NotificationCenter.default.post(name: NSNotification.Name(rawValue:"ComplexNotification"), object: nil,userInfo: userInfo)
|
1 2
| // 接收通知 NotificationCenter.default.addObserver(self, selector: #selector(handleNotification(noti:)), name: NSNotification.Name(rawValue:"ComplexNotification"), object: nil)
|
1 2 3 4 5 6 7 8 9 10 11
| // 接收到通知 @objc func handleNotification(noti:NSNotification) { print(noti.userInfo as Any) print(noti.userInfo!["name"] as! String) print(noti.userInfo!["age"] as! Int) }
======= Optional([AnyHashable("name"): "ZJ", AnyHashable("age"): 32]) ZJ 32
|
1 2 3
| deinit { NotificationCenter.default.removeObserver(self) }
|
无相传值
无相传值
就是利用 NSUserFefaults
来存取数据