【问题标题】:UIViewController's navigationController is nilUIViewController 的 navigationController 为 nil
【发布时间】:2012-11-17 19:41:47
【问题描述】:

我正在尝试从UIViewController 访问navigationController,由于某种原因它等于nil

AppDelegate:

self.mainViewController = [[MainViewController alloc] init];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.mainViewController];
self.window.rootViewController = self.navigationController;

主视图控制器:

 MyViewController *myViewController = [[MyViewController alloc] init];
[self.navigationController presentModalViewController:myViewController animated:YES];

有人遇到过这个问题吗?

谢谢!

【问题讨论】:

  • 详细说明您的问题....请详细说明。
  • 你在 mainViewController 并调用 presentModal 好吗?
  • 是的,问题是mainViewController.navigationController是nil
  • 检查这个问题可能对你有帮助。stackoverflow.com/questions/8876212/…
  • 导航控制器应该推送一个新的视图控制器,而不是显示它。这是一种不同的方法。

标签: iphone objective-c ios uiviewcontroller uinavigationcontroller


【解决方案1】:

您正在编写大部分正确的代码,但并非所有代码都在正确的位置。 你是正确的 UINavController 应该用视图控制器初始化。 但是,在您发送的代码中,MainViewController 的 init 方法在导航控制器初始化之前完成。

这是因为您真的不应该让 MainViewController 决定何时展示自己。它应该由自身之外的东西初始化和呈现——在这种情况下是 AppDelegate。

AppDelegate:

MainViewController *mvc = [[MainViewController alloc] init];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
self.window.rootViewController = self.navigationController;

如果您需要 MainViewController 以模态方式呈现某些内容,您应该在 viewWillAppear: 或 viewDidLoad: 中进行,而不是在其 init 方法中。或者,在 MainViewController (showMyModal) 上创建应用委托可以调用的公共方法。

【讨论】:

  • 它在哪里说这段代码是在 init 方法中完成的(真正的问题,我看不到第二个代码示例实际在哪里的任何迹象)
  • AppDelegate 中的代码将采用您定义的调用该操作的任何方法。
【解决方案2】:

创建 UINavigationController 将您的视图控制器分配给它的根。

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: myViewController];
[self presentViewController:navController animated:YES completion:nil];

【讨论】:

    【解决方案3】:

    UIViewController 可能没有 UINavigationController。
    导航控制器只有在您明确设置时才拥有某个控制器:

    [yourNavController setViewControllers: @[ yourViewController1, ... , yourViewControllerN] ];
    

    【讨论】:

    • 不是这样initWithRootViewController也可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多