(这既是一个问题,也是一个答案,因为要找到真正的答案需要花费相当多的时间.)

症状:我的UIViewController中没有调用viewWillAppearviewDidAppear.

原因:在UIViewController中嵌入UINavigationControllerUITabBarController(我的 case )会以某种方式中断对这些方法的调用.

解决方案:在包含上述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/)

推荐答案

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

However, the wisdom (or lack thereof), of embedding controllers in general should be guided by sane UI design principles.

最简单的反例是UITabBarControllers中嵌入UINavigationControllers.到处都是.就在我脑海中,iPhone上的iPod应用程序,以及iPhone上手机应用程序中的联系人.

我很好奇,费心go 判断它们对视图做了什么(添加到"超级控制器"视图或UIWindow.我很确定我会发现子控制器视图是视图层次 struct 中超级控制器视图的后代,这与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; ...

前缀为"Superview"的行是沿着rootViewController.view's Superview链向上移动直到达到零的输出.

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

首先,当一个新控制器被推送到堆栈上,根控制器上调用viewDidDisappear时,调用堆栈:

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

第二,在最顶端的UtiAbbarController中 Select 另一个选项卡时的调用堆栈:

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

因此,在所有情况下,苹果似乎都决定控制器应该调用其嵌入式子滚轴上的各种viewDidAppear等方法,并且视图应该类似地嵌入.我认为如果我们要把UIKit设计作为一个很好的线索来遵循的话,OP正好击中了这个要害.

Objective-c相关问答推荐

等到多个网络请求都执行完毕 - 包括它们的完成块

将 CSS 插入 UIWebView / WKWebView 中加载的 HTML

如何更改图像 tintColor

当我从导航控制器推送时如何隐藏导航栏?

isEqualTo: 和 isEqual 之间的区别:

Objective-C:集合枚举块中的 continue继续?

如何使用整数值作为键在 NSMutableDictionary 中设置值?

iOS框架改变一个属性(例如宽度)

NSString:从字符串中删除 UTF-8 重音的简单方法?

更改 UIBarButtonItem 的 Tint colored颜色

UITabBar 未在 ios 7 中显示所选项目图像

如何在表格视图中的两个单元格之间留出空间?

代码问题:格式字符串不是字符串文字

UITableViewCell 右侧有图像?

Modal segue,导航栏消失

无法将 searchBar 设置为 firstResponder

-fembed-bitcode 在 6.0 之前的 iOS 版本上不受支持

xcode 5.1 中的 Arm64 架构

如何在 iPhone SDK 中包含和使用新字体?

Unwind Segue 在 iOS 8 中不起作用