当父UIViewController打开一个新的子UIViewController时, 二者之间可能需要双向传值即父传子、子回传父, 或者单向传值的父传子、子传父。
我整理了一下,大概分为7种方法(前3种方法较常用):
1、UIStoryBoardSegue, 前置条件是要使用storyboard做界面。
2、闭包, 即在父窗口实现闭包, 在子窗口保存闭包的引用。
3、协议, 跟闭包原理一样, 即在父窗口实现协议接口, 在子窗口保存协议引用。
4、单例模式, 即父/子界面访问同一个单例。
5、文件持久化, 例如Core Data、UserDefaults或其他三方数据库; 原理跟单例模式一样, 区别是单例模式读写的是内存。
6、网络接口, 即父/子窗口与网络服务器同步数据, 原理跟单例模式、文件持久化一样, 区别是将数据保存到网络。
7、 观察者模式, 即在UIViewController里注册监听对应的Notification; 例如父窗口观察, 子窗口修改值。
一、 使用UIStoryBoard画界面是比较基础的行为,一般被认为是iOS开发入门级。 在讲述值传递前先看一下UIViewController的生命周期。
父UIViewController打开子UIViewController:
父界面prepare
父窗口viewWillDisappear
子界面viewDidLoad
子窗口viewWillAppear
父窗口viewDidDisappear
子窗口viewDidAppear
子界面 prepare
unwindToMain
子窗口viewWillDisappear
父窗口viewWillAppear
子窗口viewDidDisappear
父窗口viewDidAppear
可以看出当UIViewController不再是活动窗口时,最新执行prepare函数, 所以要在prepare函数里做业务逻辑!
/**
* 父窗口向子窗口传值
* segue, 判断下一级UIViewController类型
* sender, 触发切换ViewController的地方,在这里是按钮控件
*/
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print("父界面prepare")