Swift学习28:正向传值/反向传值和无相传值

张建 lol

前言

本文章主要介绍如何在 VC 之间进行 正向传值、反向传值

正向传值

  • ViewController
1
2
3
4
5
6
// 定义一个属性并初始化
let nextVC: NextViewController = NextViewController()

// 正向传值
nextVC.name = "张建";
self.present(nextVC, animated: true)
  • NextViewController
1
2
// 正向传值,接收方
var name: String?

反向传值

反向传值的方式有以下几种:delegate、闭包、KVONOtification 四种方式

  1. 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. 闭包
  • 定义一个闭包
1
2
// 定义一个闭包
var passBlockValue:((_ sex:String) -> Void)?
  • 闭包回传数据
1
2
// 闭包回传数据
passBlockValue!("男")
  • 接收闭包回传的数据
1
2
3
4
// 接收block传值
nextVC.passBlockValue = { value in
print(value)
}
  1. KVO

KVO 可以用来监听 自定义类 里面的属性,这个类需要继承 NSObjectdynamic 修饰,例如:我们创建一个 Person 类,监听属性 name

  • 创建 Person 类型,并定义一个属性 name
1
2
3
4
class Person: NSObject {
// dynamic修饰可支持KVO
@objc dynamic var name: String = "张三"
}
  • 全局 Person
1
2
// 定义一个全局的person
let p: Person = Person()
  • 添加监听
1
2
// 添加监听
p.addObserver(self, forKeyPath: "name",options: [.old,.new], context: nil)
  • 改变name
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)
}
  1. NOtification

通知 是可以 一对多的,通常用于不相邻两个页面之间的 传值

  • 初始化通知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 来存取数据

  • Post title:Swift学习28:正向传值/反向传值和无相传值
  • Post author:张建
  • Create time:2023-03-31 08:03:04
  • Post link:https://redefine.ohevan.com/2023/03/31/Swift/Swift学习28:正向传值:反向传值和无相传值/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
On this page
Swift学习28:正向传值/反向传值和无相传值