【问题标题】:Warning “attempt to present ViewController whose view is not in the window hierarchy - Objective C警告“尝试呈现视图不在窗口层次结构中的 ViewController - Objective C
【发布时间】:2018-01-16 20:13:20
【问题描述】:

我正在尝试调用控制器,如果有响应错误,并将用户重定向到登录控制器。

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"EventManagerStoryboard" bundle:[NSBundle mainBundle]];
LoginViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"loginID"];
[loginController viewDidLoad];
loginController.showOnlyLoginForm = YES;

[self presentViewController:loginController animated:YES completion:Nil];

我面临这个警告 -

尝试呈现 试图呈现 LoginViewController: 0x7fc958201130 on ProfileController: 0x7fc9583118e0,其视图不在窗口层次结构中!

【问题讨论】:

  • 我建议使用'loadViewIfNeeded'而不是直接调用viewDidLoad回调
  • 你应该永远自己调用viewDidLoad - 一旦加载了视图控制器的视图,它就会自动调用
  • @MilanNosáľ 没有区别。
  • 我的笔记是关于对viewDidLoad 的调用,它不应该解决你的问题。无论如何,错误消息很容易解释。当self 没有出现时你的代码被调用,所以self 不能出现其他视图控制器。但是没有更多的上下文,没有人会更好地帮助你。发生这种情况的原因可能有几十或几百个,但没有看到其余代码我们只能猜测。换句话说,您显示的代码是可以的,问题出在代码的其余部分。

标签: ios objective-c


【解决方案1】:

不要在 viewDidLoad 中运行此代码,在 viewDidAppear 中尝试一下

 [self presentViewController:loginController animated:YES completion:Nil];

编辑:

如果你实现了navigationController,在appDelegate中使用

 [(UINavigationController *)self.window.rootViewController pushViewController:vc animated:YES];

【讨论】:

  • 其实我是在connectionDidFinishLoading中运行的
  • 是否显示 ProfileController 或您实现 connectionDidFinishLoading 的位置
  • 我正在我的应用委托上实现 connectionDidFinishLoading。当有一些响应错误时,我会强制注销用户。
  • 您可以实现导航控制器来完成此操作,因为 appDelegate 中没有 viewController 来呈现您的登录信息或使用通知中心/委托来告诉另一个 viewController 来制作呈现而不是 appdelegate
  • 但是您的日志表明您希望在名为 ProfileController 的 viewController 中呈现它,即使是自我呈现......也不会在应用委托中运行
猜你喜欢
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2020-08-07
相关资源
最近更新 更多