Swift纯代码页面传值

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)
    }
}

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

你可能感兴趣的:(Swift纯代码页面传值)