UIViewController.navigationController变为零

时间:2012-01-13 02:59:28

标签: uiviewcontroller uinavigationcontroller

我遇到了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];
}

调试输出显示selfself.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工作正常,我相信其他一切必须继续。你有什么指针吗?如有必要,我很乐意提供更多细节。

4 个答案:

答案 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,它就可以正常工作。