viewWillAppear,viewDidAppear没有被调用,没有被触发

psc*_*ang 38 iphone objective-c uitabbarcontroller viewwillappear

(这既是问题又是答案,因为需要花费大量时间才能找到真正的答案.)

症状:viewWillAppear,viewDidAppear没有被称为在我的UIViewController.

原因:嵌入一个UINavigationControllerUITabBarController(我的情况)以UIViewController某种方式中断调用这些方法.

解决方案:在UIViewController包含上述UINavigationController/的手动调用它们UITabBarController.

例如(假设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/)

ima*_*boy 10

我将继续并且不同意@ St3fan,并UIKit用作反例.

然而,嵌入控制器的智慧(或缺乏)应该由理智的UI设计原则指导.

UINavigationControllers嵌入的最简单的反例UITabBarControllers.这些出现在各处.就在我脑海中,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; ...
Run Code Online (Sandbox Code Playgroud)

以"Superview"为前缀的线条是从rootViewController.view's超级视图链向上走直到达到零的输出.

然后,当然快速浏览几个viewDidDisappear可以在根视图控制器上调用的调用堆栈.

首先,viewDidDisappear由于新控制器被推入堆栈而在根控制器上调用调用堆栈:

-[RootController viewDidDisappear:]
-[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:]
...
Run Code Online (Sandbox Code Playgroud)

其次,在最顶层的UITabBarController中选择另一个选项卡时调用堆栈:

-[RootController viewDidDisappear:]
-[UINavigationController viewDidDisappear:]
-[UITabBarController transitionFromViewController:toViewController:transition:shouldSetSelected:]
Run Code Online (Sandbox Code Playgroud)

因此,在所有情况下,似乎Apple决定控制器应该viewDidAppear在其嵌入式子控制器上调用各种等方法,并且视图应该以类似方式嵌入.如果我们将UIKit设计作为一个良好的领先者,那么我认为OP正好击中了这个钉子.