2017-06-04 46 views
0

我正在使用一些自定义控制器转换,它使用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; 
    } 

回答

0

如果ViewController你也正在力推设置navigationController?.delegate = self,那么当ViewController被弹出,这ViewController将被重新分配并且weak var delegate将被设置为nilviewDidLoad()仅在ViewController第一次创建时运行,所以当返回到第一个ViewController时,viewDidLoad()将不会再次运行。 viewWillAppear()总是在ViewController被推送或当它被返回到弹出时被调用,因此viewWillAppear()是设置此delegate的正确位置。

+0

虽然没有被弹出。它是NavigationController的根控制器。 – GoldenJoe

+0

我建议在代表值上设置一个观察断点,以确定谁将其设置回零。 – vacawama

+0

我不擅长装配。 – GoldenJoe

相关问题