我遇到了UIViewController.navigationController
成为nil
的问题,我拼命想找到答案。
UINavigationController
在应用程序委托中得到设置:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.rootViewController = [[RootViewController alloc] initWithNibName:@"RootView" bundle:nil];
UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:self.rootViewController];
[self.window addSubview:navigationController.view];
[self.window makeKeyAndVisible];
return YES;
}
当RootViewController
出现时,self.navigationController
成员已设置,我可以使用它来隐藏导航栏,如下所示:
- (void)viewWillAppear:(BOOL)animated {
NSLog( @"self = %@, self.navigationController = %@", self, self.navigationController );
[self.navigationController setNavigationBarHidden:YES animated:NO];
}
调试输出显示self
和self.navigationController
的值。
在此控制器中点击按钮时,self
确实保持相同的值,但self.navigationController
现在是nil
:
- (IBAction)buttonClicked:(id)sender {
NSLog( @"self = %@, self.navigationController = %@", self, self.navigationController );
// here, self.navigationController is nil, so
// [self.navigationController pushViewController:...] doesn't work :-(
}
我已经看到了很多关于这个问题的问题,答案总是UIViewController
不是UINavigationController
的一部分。由于访问navigationController
中的viewWillAppear
工作正常,我相信其他一切必须继续。你有什么指针吗?如有必要,我很乐意提供更多细节。
答案 0 :(得分:2)
在app delegate中尝试此操作:
[(UINavigationController *)self.window.rootViewController pushViewController:yourViewController animated:NO];
如果您要调试rootviewcontroller,那么它实际上是UINavigationController
。这对我有用。
答案 1 :(得分:1)
您的代码显示您只使用了navigationController的视图,但只是祈祷导航控制器的生命由一些魔术手处理,而事实并非如此。
你需要有人在这里成为navigationController的显式拥有者。
事实上,以下一行:
[self.window addSubview:navigationController.view];
似乎表明你想要的是窗口的rootViewController是navigationController:
self.window.rootViewController = navigationController;
但是,似乎应用程序的委托也是navigationController的所有者,因此navigationController实际上应该是你应用程序代表的ivar。
简而言之,修复你的对象图(它会巧合地做你手动做的额外保留并修复你的错误)
答案 2 :(得分:0)
我遇到了一个nil视图控制器的问题,发现它在故事板中没有正确连接到应用代理。
答案 3 :(得分:0)
与往常一样,只需在几分钟后找到解决方案,就可以制定问题。
我猜,我成了ARC的牺牲品。一旦我在应用程序委托中保留UINavigationController
,它就可以正常工作。