2011-03-11 42 views
1

我已經看到一些關於ViewWillAppearViewDidAppear的文章在某些情況下沒有開火,但我仍然想知道行爲背後的想法是什麼,以及我如何在我的具體情況下解決它。ViewWillAppear不會在模態控制器中調用。這裏有什麼問題?

  • window具有由一個deafult UIVieController處理,幷包含一個按鈕一個視圖。
  • 單擊此按鈕會以模態方式顯示另一個視圖控制器(VC_MAIN)。
  • 根據設置,顯示模態視圖控制器(VC_MAIN)將或者本視圖A或B.視圖
  • 視圖A和B由不同視圖控制器(VC_AVC_B)處理。
  • VC_AVC_B中沒有調用任何ViewWill *或ViewDid *方法。
  • 我可以通過在相應的ViewDid *和ViewWill *方法中手動調用VC_MAIN來解決此問題。但如果VC_MAIN決定從VC_A切換到VC_B這沒有幫助。 VC_MAIN的視圖*方法將不會被再次調用,也不會VC_A的VC_B的

我當然可以在從A切換到B時變鈍VC_MAIN,但我不想。我想讓動畫切換,而不是打開另一個模態視圖。

爲什麼heck不會調用這些方法?它真的超越了我!如果你看看UISplitViewController:它包含兩個子控制器,它可以顯示其他控制器。他們基本上和我試圖做的一樣。蘋果是否將代碼全部放在了代碼中?

+0

「ViewWillAppear」中的大寫字母V是否爲錯字?該方法被命名爲'viewWillAppear:'。由於所有方法名稱都以小寫字母開頭。 – 2011-03-11 14:24:20

+0

啊,對不起。我正在使用MonoTouch。我添加了一個標籤。但是MT和ObjC的問題是一樣的。 – Krumelur 2011-03-11 14:25:56

回答

1

我對這種問題的經驗:
如果你有一個視圖控制器VC管理主視圖V這種觀點有一個子視圖V「另一個視圖控制器VC管理」viewWillAppear:和其他方法如willRotateToInterfaceOrientation:不發送到VC'

什麼你可以手動正向這些電話來自VC

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [mySubViewController viewWillAppear:animated]; // VC' 
} 

(注:我不熟悉的MonoTouch,所以我回答ObjC代碼)

編輯

它提醒我View Controller Programming Guide明確指出:

您創建的每個自定義視圖控制器對象負責管理所有視圖中的所有 層級的單個視圖 。 [...]控制器與其視圖 層次結構中的視圖之間的一一對應的 對應關係是關鍵設計 的考慮因素。您不應該使用 多個自定義視圖控制器到 管理相同的 視圖層次結構的不同部分。

+0

我已經做了。問題是,如果我將mySubViewController更改爲其他內容,VC.viewWillAppear將不會再被調用(它已經出現)。因此mySubViewController的viewWillAppear:也不會觸發。我沒有辦法解決它,但改變了我的設計。 :-( – Krumelur 2011-03-11 14:55:39

+0

@Krumelur是的,我沒有看到有效的解決方案,特別是如果它是來自Apple的設計決策(但在某些情況下,我希望能夠嵌套視圖控制器)。從我的答案中的文檔引用... – Jilouc 2011-03-11 15:06:34

+0

我想蘋果的觀點是,意見可能會或可能不會有與他們相關的viewcontrollers。必須通過所有的子視圖每次尋找意見將是浪費時間,所以最好讓開發人員根據需要處理它 – 2011-03-11 16:44:37

0

我猜想的一個原因是

之間的步驟取決於設置,顯示模態視圖控制器(VC_MAIN)要麼本視圖A或B.視圖

觀和B由不同的視圖控制器(VC_A和VC_B)處理。

如果您閱讀Apple視圖控制器編程指南中的介紹,他們建議每個屏幕只有一個視圖控制器,即使它管理多個視圖或子視圖的層次結構。在VC_MAIN中直接管理視圖A和B可能會更好,那麼您將得到所需的通知。如果您出於任何原因而提供獨立視圖控制器的方式,您可能需要自己通知他們。

+0

但這是不可能的。一個屏幕可能有一個帶UINavigationController的UISplitViewController,左邊帶有一個UIViewController,帶有模塊化的TOP上的UIViewController ... – Krumelur 2011-03-11 14:57:20

-1

你應該真的手動調用這些方法。它是一種管理和顯示VC視圖的自定義方式,因此您可以決定每個子視圖控制器何時接收生命週期調用。 apropriatelly將您VC_Main viewWillAppear中調用viewWill/DidHide

,調用showVC方法基於當前: 在VC_MAIN,創建一個showVC:NEWVC方法,將調用

[newVc viewWillAppear] 
[mainView addSubview:newVc.view] 
[newVc viewDidAppear] 

同樣,創建一個hideVC config,每次切換視圖時,這些方法都會被正確調用。

它的一個老問題,部分在iOS5上處理,但仍然以這種方式正常工作,並完全向後兼容到iOS3。

相關問題