UIViewController之间传值的7种方法

        当父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


子UIViewController退出时:

子界面 prepare
unwindToMain
子窗口viewWillDisappear
父窗口viewWillAppear
子窗口viewDidDisappear
父窗口viewDidAppear

可以看出当UIViewController不再是活动窗口时,最新执行prepare函数, 所以要在prepare函数里做业务逻辑!

    /**
     *  父窗口向子窗口传值
     *  segue, 判断下一级UIViewController类型
     *  sender, 触发切换ViewController的地方,在这里是按钮控件
     */
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print("父界面prepare")
    
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值