2017-06-04 113 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

相關問題