我应该在哪里设置UINavigationController的委托属性?
问题描述:
我正在使用一些自定义控制器转换,它使用UINavigationController的delegate
属性。如果我将它设置为viewDidLoad()
,则self.navigationController?.delegate
会在推送后的某个点被取消分配。将其设置为viewWillAppear()
的作品,但我想知道为什么该资源首先被取消分配,以及人们通常设置此属性的位置。我应该在哪里设置UINavigationController的委托属性?
// 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;
}
答
如果ViewController
你也正在力推设置navigationController?.delegate = self
,那么当ViewController
被弹出,这ViewController
将被重新分配并且weak var delegate
将被设置为nil
。 viewDidLoad()
仅在ViewController
第一次创建时运行,所以当返回到第一个ViewController
时,viewDidLoad()
将不会再次运行。 viewWillAppear()
总是在ViewController
被推送或当它被返回到弹出时被调用,因此viewWillAppear()
是设置此delegate
的正确位置。
虽然没有被弹出。它是NavigationController的根控制器。 – GoldenJoe
我建议在代表值上设置一个观察断点,以确定谁将其设置回零。 – vacawama
我不擅长装配。 – GoldenJoe