Swift纯代码页面传值

作者: Sheepy | 来源:发表于2015-09-26 01:23 被阅读3578次
    Update: 之前的代码会造成循环引用,导致两个类都不能被正确回收,应做如下修改:
    protocol BaseCtrlDelegate: class {
        func dismissPushedCtrl(controller: UIViewController)
    }
    //相同内容
    class PushedCtrl: UIViewController {
        //相同内容
    
        weak var delegate: BaseCtrlDelegate!
    }
    

    页面跳转啊页面间传值啊,这是每个项目几乎都要用到的东西。近年来苹果一直都在推Storyboard,页面跳转可以直接在Storyboard上拉线,然后用segue或者unwind来做一些传值的操作,非常方便,这里就不细说了。

    然而在实际开发中,由于各种原因或者因为个人喜好我们可能会用纯代码开发,当然也包括页面跳转跟页面传值。今天我就遇到了这种情况,由于之前一直是用segue跟unwind的,所以稍微折腾了一下才搞定,顺便也记录一下,希望能帮到有需要的人。

    跳转方式就以最平常的Push为例,跳转的时候传值只需要在当前Controller中直接对将要跳转的Controller的一个实例对象进行操作即可(见代码注释),而在返回上个页面的时候进行传值就需要用到委托了,关于委托我之前有篇博文详细说过,今天就直接上代码了。

    protocol BaseCtrlDelegate {
        func dismissPushedCtrl(controller: UIViewController)
    }
    
    class BaseCtrl: UIViewController, BaseCtrlDelegate {
        var baseMsg: String! {
            didSet {
                print("BaseCtrl:" + baseMsg)
            }
        }
        //获取即将出栈的ViewController的实例,相当于获取它内部的数据(如msg)
        func dismissPushedCtrl(controller: UIViewController) {
            if let pushedCtrl = controller as? PushedCtrl{
                //传值
                baseMsg = pushCtrl.backMsg
                loginCtrl.navigationController?.popViewControllerAnimated(true)
            }
        }
       
        //......
    
        //跳转按钮点击事件
        func push() {
            baseMsg = "I'm coming!"
            let pushedCtrl = PushedCtrl()
            //传值
            pushedCtrl.backMsg = baseMsg
            pushedCtrl.delegate = self
            self.navigationController?.pushViewController(pushedCtrl, animated: true)
        }
    }
    
    class PushedCtrl: UIViewController {
         //......
        var backMsg: String! {
            didSet {
                print("PushedCtrl:" + backMsg)
            }
        }
        var delegate: BaseCtrlDelegate!
        //返回按钮点击事件
        func back() {
            backMsg = "I'm back!"
            delegate.dismissPushedCtrl(self)
        }
    }
    

    这就是整个过程,在跳转和返回时都进行了传值操作。代码是直接在页面上写的,没调试过,大家可以补充完整然后跑一下看看。今天就先这样。

    相关文章

      网友评论

      • xiongyi:大神,有没有demo给下载来看一看啊
        Sheepy:@xiongyi 没有:joy: 这个很简单的 其实只要第二个 controller 持有第一个 controller 的 weak 引用 然后在第二个 controller 要消失前对第一个 controller 操作就行 譬如直接对第一个 controller 的某个属性赋值 像我文中这样用协议的话只是更通用一点

      本文标题:Swift纯代码页面传值

      本文链接:https://www.haomeiwen.com/subject/xekwcttx.html