2013-01-04 24 views
17

子視圖控制器由子視圖控制器的實現中下面的代碼刪除:父視圖控制器如何通知其子視圖控制器已自行刪除?

- (void)commandFinishVC 
{ 
    [ self.view removeFromSuperview]; 
    [ self removeFromParentViewController ]; 
} 

子視圖控制器和視圖被成功刪除,但父母是如何通知呢? -viewDidDisappear未被調用,-viewDidUnload已被棄用。

從我可以發現的例子中,始終認爲父視圖控制器是提名被移除孩子的事件的發起者,但是對於我來說,孩子應該是自治的,以完成邏輯。

應該使用self.parentViewController屬性調用remove方法,並在父視圖控制器中使用類似下面的內容:

- (void)commandFinishVC 
{ 
    [ childVC.view removeFromSuperview]; 
    [ childVC removeFromParentViewController ]; 
} 

回答

25

是的,你的父母控制器通常應該控制子控制器的添加和刪除,所以你的第二種方法似乎更適用。請參閱UIViewController類引用的Implementing a Container View Controller部分。

我懷疑,你可以與你的前任的做法,那裏的孩子被去除本身脫身,但蘋果是他們的文檔一致,對Implementing UIViewController Containment在WWDC 2011年會議指出,容器控制器負有管理孩子的責任。

因此,在回答您關於孩子如何通知父母它已被移除的問題時,沒有爲此建立的協議。但這並不令人驚訝,因爲假設父母將啓動這一過程。就兒童需要啓動此過程而言,文檔建議父母應該有一個公共API來管理兒童控制器。

因此,雖然沒有通知父級的子級協議,但是,有一個已發佈的API,父級控制器通過該API發送通知,告知其已被移動/刪除。具體而言,當父母控制員將孩子移除時,應該致電willMoveToParentViewControllerThis documentation明確地說,我們必須執行本通知:

如果要實現自己的容器視圖控制器,它必須調用子視圖控制器的willMoveToParentViewController:方法調用removeFromParentViewController方法之前...

因此,在視圖控制器編程指南Adding and Removing a Child節討論,移除一個孩子,我們要等到:

[childVC willMoveToParentViewController:nil]; 
[childVC.view removeFromSuperview]; 
[childVC removeFromParentViewController]; 

不出所料,didMoveToParentViewController的文檔同樣毫不含糊:添加子控制器時,必須在動畫/轉換(如果有)完成後調用didMoveToParentViewController。我不知道如果我們不把這兩種通知方法稱爲這種方法會發生什麼,但是蘋果表示我們必須這樣做,因此似乎謹慎。

+0

背後的原因是使用VC(視圖控制器)容器作爲純容器,沒有屬於它的視圖。子容器內的視圖有其相關的事件;因此兒童VC內的動作(例如,按下完成按鈕)確定兒童VC的釋放。 – Roddy

+0

非常感謝您的回覆,它確實有助於澄清我一直在閱讀的內容。 – Roddy

+0

Rob,你知道如果你不是在你的子視圖控制器中重寫該方法,willMoveToParentViewController是否真的有必要?蘋果的文檔聽起來就像你應該這樣稱呼,但是我不知道它是否真的做了什麼,如果你沒有在你的孩子中覆蓋它。如果我不叫這種方法,我還沒有看到任何問題。 – rdelmar

相關問題