为什么将以下代码从旧条目更改为新条目可修复以下问题。
代码:
// OLD Entry - Did not work
//[self.window addSubview:navigationController.view];
// NEW Entry - Fixed it
self.window.rootViewController = self.navigationController;
使用旧代码时出现问题:
我正在使用UINavigationController并有一个“mainView”UITableViewController,然后是第二级视图,我将其推入堆栈,让我们称之为“detailedView”UITableViewController。
正常导航从主要导航到细节工作正常
但是在启动时自动启动到第二个视图(因为我保存状态)我到第二个视图OK,但在这种情况下,工具栏按钮不会出现在第二个视图的底部。当我返回主页面(通过UINavigationController标准安排),然后在UITableView中选择行,然后再次返回相同的视图,工具栏项目显示正常。
无法跟踪此情况,但最终通过反复试验我注意到appDelegate(所有地方)的代码更改(见上文)似乎解决了这个问题。
有什么想法吗?
编辑:为了完整性,这里是完整的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
abort(); // TODO: Do better job here than abort
}
rootViewController.managedObjectContext = context;
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
编辑2:哦,我确实有一个NIB文件并在界面构建器中设置了根视图控制器/窗口 - 所以我想知道我是否在这里混合使用NIB和编程方法可能会导致问题?
编辑3:还注意到当我添加“self.window.rootViewController = self.navigationController”行时,以下didFinishLaunchingWithOptions代码工作。这是没有这一行(这是coredatabooks示例所做的)我得到了问题。
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
rootViewController.managedObjectContext = self.managedObjectContext;
self.window.rootViewController = self.navigationController; // WORKS WHEN I ADD THIS LINE IN FOR SOME REASON???
// Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
return YES;
答案 0 :(得分:6)
两种方法之间的区别在于,一种方法触发了视图生命周期方法,另一种方法则没有。
即。设置window.rootViewController
将导致旧视图控制器接收消息:viewDidDissaper viewWillDissapear等..而新视图控制器将接收viewWillApear,viewDidAppear等。
addSubview:
不会这样做。
这有帮助吗?
修改强>
详细阅读您的帖子,看起来您正在以详细视图的viewDidAppear
方法以编程方式添加按钮。
rootViewController
的{{1}}属性自4.0起添加。文档没有明确提到它将触发视图生命周期方法,我通过像你自己的跟踪和错误发现了这一点。 (也许有人可以针对苹果文档提出问题)。
如果你需要向后兼容3.x,你可以这是一个自定义UIWindow子类。我的代码如下。使用UIWindow
代替window.djRootViewController = yourViewController
。它设计用于Interface builder。
window.rootViewController