2012-10-26 70 views
2

這使我困惑不已。視圖控制器如何知道它將被添加?

說你做:

[self.view addSubview: someController.view]; 

如何someController知道它的觀點是被加載並調用viewDidAppear等?

我們傳遞的是它的視角而不是控制器。然而一些控制器知道。

如果self.view本身不在窗口的視圖層次結構中,會發生什麼情況。將someController的viewWillAppear等被調用?

實現此目的的一種方法是讓視圖具有指向控制器的弱指針,比如它是委託,然後檢查視圖本身是否是窗口對象的後代。

這是實際執行的方式嗎?如果不是,它是如何實際完成的?即使不是,認爲它是以這種方式實施是否正確?

我的關注點如下: 我很好奇,因爲我想了解這個viewWillAppear會如何顯示。幾個月,我與IOS玩,調用那些明確不知道爲什麼它被稱爲或不叫。有大量的帖子抱怨viewWillAppear/Disapear被調用或未被調用。有些人會被叫兩次。我想知道如何以及何時調用它。我越來越擅長但尚未完成。

回答

2

我從來沒有見過UIKit源代碼,但我確定它是你懷疑的,而且UIView有一個UIViewController的私有引用。這由documentation for UIResponder確認。

的UIResponder類不存儲或設置下一個響應者:由於這兩種的UIView和UIViewController的參與響應鏈,可以通過調用視圖的nextResponder方法(重點煤礦)獲得從視圖控制器參考自動,而不是默認返回零。子類必須重寫此方法來設置下一個響應者。 UIView通過返回管理它的UIViewController對象(如果它有一個)或它的超級視圖(如果沒有)來實現此方法; UIViewController通過返回其視圖的超級視圖來實現該方法; UIWindow返回應用程序對象,並且UIApplication返回nil。

至於你的其他問題:我不認爲viewWillAppear:將被調用,除非視圖實際上將出現;換句話說,除非視圖在窗口的視圖層次結構中。 (你可以很容易地寫一個快速演示項目來測試這個。)

+0

嗯......我猜沒有確定的答案。唯一的辦法就是按照你的說法去做,然後寫一個演示項目。我會在蘋果開發者論壇上提問。這使我困惑不已。然後有一個孩子控制器增加了複雜性。 –

+0

@HaryantoCiu您只是好奇,或者當視圖添加到窗口或超級視圖時需要通知您嗎?因爲UIView有'willMoveToWindow:'和'willMoveToSuperview:',你可以通過子類來捕捉它。 – benzado

+0

我很好奇,因爲我想了解這個view如何出現。幾個月,我與IOS玩,調用那些明確不知道爲什麼它被稱爲或不叫。有大量的帖子抱怨viewWillAppear/Disapear被調用或未被調用。有些人會被叫兩次。我想知道如何以及何時調用它。我越來越擅長但尚未完成。 –

相關問題