我正在使用一些自定义控制器转换,它们使用UINavigationController的delegate
属性。如果我在viewDidLoad()
中设置它,self.navigationController?.delegate
会在推送后的某个时刻解除分配。在viewWillAppear()
中设置它有效,但我想知道为什么该属性首先被解除分配,以及人们通常设置此属性的位置。
// The first time you push, it will work correctly, and the delegate function below is called. After you pop back to this controller, delegate is nil (has been deallocated)
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.delegate = self
}
// Brute force works
override func viewWillAppear(_ animated: Bool) {
self.navigationController?.delegate = self
}
func navigationController(_ navigationController: UINavigationController,
animationControllerFor operation: UINavigationControllerOperation,
from fromVC: UIViewController,
to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
if operation == .push {
return WTPPushAnimator()
}
if operation == .pop {
return WTPPopAnimator()
}
return nil;
}
答案 0 :(得分:0)
如果您推送的ViewController
也设置了navigationController?.delegate = self
,那么当弹出ViewController
时,ViewController
将被取消分配,weak var delegate
将会被释放设为nil
。 viewDidLoad()
仅在首次创建ViewController
时运行,因此当返回到第一个ViewController
时,viewDidLoad()
将无法再次运行。在推送viewWillAppear()
或在弹出广告时返回时,始终会调用ViewController
,因此viewWillAppear()
是设置此delegate
的正确位置。