39

(这既是问题又是答案,因为需要大量挖掘才能找到真正的答案。)

症状:viewWillAppearviewDidAppear在我的 UIViewController 中没有被调用。

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

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

例如(假设projectNavigationController是你的UINavigationController):

-(void)viewWillAppear:(BOOL)动画{
    [超级viewWillAppear:动画];
    [projectNavigationController viewWillAppear:animated];
}

-(void)viewWillDisappear:(BOOL)动画{
    [超级viewWillDisappear:动画];
    [projectNavigationController viewWillDisappear:animated];
}

-(void)viewDidAppear:(BOOL)动画{
    [超级 viewDidAppear:动画];
    [projectNavigationController viewDidAppear:animated];
}

-(无效)viewDidDisappear:(BOOL)动画{
    [超级 viewDidDisappear:动画];
    [projectNavigationController viewDidDisappear:animated];
}

就我而言,我有一个内在的UITabBarController,我相应地调用了方法,一切都解决了。

(解决方案的归属:http: //davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/

4

2 回答 2

11

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

然而,嵌入控制器的智慧(或缺乏智慧)通常应该以理智的 UI 设计原则为指导。

最简单的反例UINavigationControllers嵌入在UITabBarControllers. 这些无处不在。就在我的脑海中,iPhone 上的 iPod 应用程序和 iPhone 上电话应用程序中的联系人。

我很好奇,懒得去检查他们对视图做了什么(添加到“超级控制器”视图或UIWindow.我很确定我会发现子控制器视图是超级控制器的后代视图层次结构中的视图,这与 St3fan 的建议相反。

我启动了一个非常快速的 iPhone 应用程序,将所有内容都连接到 InterfaceBuilder 中,以创建一个UITabBarController带有两个选项卡的基于应用程序,第一个是UINavigationController一个普通的 oleUIViewController作为它的根视图控制器,第二个是一个普通的旧选项卡,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; ...

以“Superview”为前缀的行是沿着rootViewController.view'ssuperview 链向上直到达到 nil 的输出。

viewDidDisappear然后当然快速浏览一下在根视图控制器上会被调用的几个地方的调用堆栈。

首先,当viewDidDisappear新控制器被压入堆栈时,在根控制器上调用调用堆栈:

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

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

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

因此,在所有情况下,Apple 似乎决定控制器应该viewDidAppear在其嵌入式子控制器上调用各种 , etc 方法,并且应该以类似方式嵌入视图。UIKit我认为如果我们要把设计作为一个很好的线索,那么 OP 就一针见血了。

于 2010-08-25T04:40:57.537 回答
0

我刚刚看到了同样的情况。早些时候,由表格单元格选择触发的界面构建器 segue 已经停止工作,在对代码进行了一些恼怒之后,我只是手动设置它,从表格视图委托中的单元格选择覆盖调用。

后来我在被调用的视图控制器中进行了一些布局更改,发现 viewDidAppear 没有被调用,如上所述。调试输出提到了“嵌套推送操作”之类的东西,因为我在手动推送操作中对自己有很大的评论

#warning I SHOULD NOT HAVE TO DO THIS!!

我对 segue 代码设置了断点,果然,IB segue 现在正在工作,是我在表格单元格选择代码中的手动操作弄乱了被调用视图中的委托调用。我删除了手动代码,一切都很好。

在推送视图后调用单元格选择代码似乎很奇怪。我必须做一个协议并委托来获取调用者中所选单元格的索引路径。

于 2012-01-15T09:43:28.223 回答