我正在處理一些我需要重構的代碼。視圖控制器充當另外兩個視圖控制器的容器,並將在它們之間進行交換,如下面的代碼所示。瞭解addChildViewController的使用
這可能不是最好的設計。以這種方式交換視圖控制器可能不是必需的。我明白那個。然而,當我使用這段代碼時,我想進一步理解addChildViewController調用會發生什麼。在蘋果的文檔或相關問題中,我一直無法找到答案(可能表明設計需要改變)。
特別是 - 容器視圖控制器如何處理要求添加子視圖控制器的情況,它已經添加了?它是否認識到它已經添加了該視圖控制器對象?
E.g.如果下面的代碼是一個方法裏 - 這方法被調用兩次......
[self addChildViewController:viewControllerB];
[self.view addSubview:viewControllerB.view];
[viewControllerB didMoveToParentViewController:self];
[viewControllerA willMoveToParentViewController:nil];
[viewControllerA.view removeFromSuperview];
[viewControllerA removeFromParentViewController];
感謝, 加文
嗨,Jesper,謝謝。我已經繼承了這個代碼,所以我會重新開始工作。在「容器」視圖控制器中交換子視圖控制器完全是一個實現細節。該類的公共接口中沒有任何東西允許客戶更改視圖。這是一個顯示兩個視圖控制器之一的內部設計...逐步通過,我注意到添加不會發生兩次(比如,從applicationWillEnterForeground重複)。我沒有注意到任何負面影響...我知道我需要改變它,但我也很好奇發生了什麼;) –
啊,這是有道理的。嘗試儘可能少地使用處理方法。另一個讓調試更容易的方法(如果你必須處理一個行爲不當的環境,這可能會解決問題)是讓這些方法「冪等」,意味着調用它們一個或42個在功能上是等價的,並且會做同樣的事情。行爲良好的代碼應該或多或少地沒有任何阻力地落入其中。尤其是通知('applicationWillEnterForeground'等)往往會被調用掉UI線程/隊列,所以要小心這一點。 – Jesper