2010-08-24 117 views
36

viewWillAppear中,viewDidAppear不會被調用,不費一槍

症狀(這是兩個問題的答案,因爲它花了相當多的挖掘,找到真正的答案。):viewWillAppearviewDidAppear沒有被稱爲在我的UIViewController 。

原因:嵌入UINavigationControllerUITabBarController(我的情況)在UIViewController以某種方式中斷與調用這些方法。

解決方法:在包含上述UINavigationController/UITabBarControllerUIViewController中手動調用它們。

例如(假設projectNavigationController是你UINavigationController):

 
-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [projectNavigationController viewWillAppear:animated]; 
} 

-(void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [projectNavigationController viewWillDisappear:animated]; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [projectNavigationController viewDidAppear:animated]; 
} 

-(void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    [projectNavigationController viewDidDisappear:animated]; 
} 

在我來說,我有一個內部UITabBarController和我相應地調用方法,一切都解決了。

(上解決署名:http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/

+1

只是因爲我很好奇...:爲什麼你會將標籤欄控制器包裝到另一個viewcontroller? :)在大多數情況下,它們是視圖(控制器)層次結構的根... – Toastor 2010-08-24 20:23:20

+0

+1 ..真的解決了我的問題..乾杯 – 2011-05-09 17:14:27

回答

9

我要繼續前進,不同意@ St3fan,並使用UIKit作爲反例。

然而,一般嵌入控制器的智慧(或缺乏)應該以理智的UI設計原則爲指導。

最簡單的反例是嵌入UITabBarControllersUINavigationControllers。這些都出現在各地。就在我頭頂,iPhone上的iPod應用程序和iPhone上的電話應用程序中的聯繫人。

我很好奇,想檢查他們對視圖做了什麼(添加到「超級控制器」視圖或UIWindow。我非常肯定我會發現子控制器視圖是後代這與St3fan的推薦相反

我掀起了一個非常快的iPhone應用程序,它將InterfaceBuilder中的所有東西都連接起來,創建一個基於UITabBarController的應用程序,其中第一個是一個UINavigationController與一個簡單的ole UIViewController,因爲它的根視圖控制器,第二個選項卡與一個普通的舊UIViewController只是所以我有第二個標籤點擊後

撒上一些NSLog報表輸出的各種UIView's因爲我們看到這個控制器:

tabBarController.view = <UILayoutContainerView: 0x5b0dc80; ... 
navigationController.view = <UILayoutContainerView: 0x59469a0; ... 
rootViewController.view = <UIView: 0x594bb70; ... 
Superview: <UIViewControllerWrapperView: 0x594cc90; ... 
Superview: <UINavigationTransitionView: 0x594a420; ... 
Superview: <UILayoutContainerView: 0x59469a0; ... // navigationController.view 
Superview: <UIViewControllerWrapperView: 0x594b430; ... 
Superview: <UITransitionView: 0x5b0e110; ... 
Superview: <UILayoutContainerView: 0x5b0dc80; ... // tabBarController.view 
Superview: <UIWindow: 0x5942a30; ... 

與「上海華」爲前綴的線是由走上了rootViewController.view's上海華盈鏈,直到擊中零輸出。

當然,快速瀏覽幾個地方的調用堆棧,其中viewDidDisappear將在根視圖控制器上調用。

首先,當viewDidDisappear稱爲根控制器作爲一個新的控制器的結果上被推到堆棧中的調用堆棧:當另一個選項卡在被選擇

-[RootController viewDidDisappear:] 
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] 
... 

其次,調用堆棧最頂層的UITabBarController:

-[RootController viewDidDisappear:] 
-[UINavigationController viewDidDisappear:] 
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:] 

所以在所有的情況下,看來蘋果公司決定控制器應調用各種viewDidAppear,對他們的嵌入式子控制器和等方法視圖的應該嵌入類似LY。我認爲如果我們將UIKit設計作爲一個很好的領先優勢,那麼OP就會把這個釘子釘在頭上。

+0

有趣的分析imaginaryboy。我感謝你的POV St3fan。 在典型的設置中,UITabBarController(具有自己的導航控制器和視圖控制器)被添加到窗口中。很容易看到這一點。 但是,我的情況稍有不同。在我的情況下,用戶通過模態進入應用程序的特定模式。在其他模式下,用戶從最初看到的UITabBarController中有一個不同的UITabBarController。也許我可以調用應用程序委託將新的UITabBarcontroller添加到窗口(?),但將其添加到模態UIViewController更容易。 – pschang 2010-08-25 18:35:20

0

我剛剛看到這種情況。早些時候,由表格單元格選擇觸發的界面構建器segue已停止工作,並且在某些惱人的代碼挖掘之後,我只是手動設置它,從表視圖委託中的單元格選擇覆蓋中調用。

後來我在被調用的視圖控制器中進行了一些佈局更改,並發現viewDidAppear沒有被調用,如上所述。提到「嵌套推操作」或類似的調試輸出,因爲我在我的手動推送操作不得不自己是一個很大的評論

#warning I SHOULD NOT HAVE TO DO THIS!!

我breakpointed的SEGUE代碼,果然,IB SEGUE現在正在工作,這是我在表格單元格選擇代碼中的手動操作,它在被調用的視圖中搞亂了委託調用。我刪除了手動代碼,一切都很好。

在推送視圖後調用單元格選擇代碼看起來很奇怪。我必須做一個協議和委託來獲取調用者中選定單元格的索引路徑。

相關問題