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