【问题标题】:iOS Warning: attempt to present ViewController whose view is not in the window hierarchyiOS 警告:尝试呈现其视图不在窗口层次结构中的 ViewController
【发布时间】:2015-03-11 19:42:44
【问题描述】:

我知道围绕这个警告有很多讨论,我们应该只在呈现视图控制器完全呈现并添加到视图层次结构中之后呈现视图控制器。所有这些规则都得到遵守,我在展示第二个模态视图控制器时仍然收到此警告。

这是这里发生的完整动作序列:

  1. 在应用启动时,初始化基本视图控制器并将其添加到窗口。
  2. 从基本视图控制器,点击按钮,模态显示第一个视图控制器。
  3. 从第一个视图控制器,点击一个按钮,模态显示第二个视图控制器。解散后,我需要显示第一个视图控制器,这样我就不会解散第一个 VC,然后从基础 VC 中呈现第二个 VC。

控制台警告:

2015-03-11 13:15:43.467 MyApp[597:84839] Warning: Attempt to present <MyCustomNavigationViewController: 0x15d6a8920> on <MyFirstModalViewController: 0x15d67cc60> whose view is not in the window hierarchy!

想法?

下面是我的代码 [不显示按钮处理程序;从调用方法中获取代码]:

// Present base view controller
self.window.backgroundColor = [UIColor whiteColor];
self.primaryViewController = [[MyParentViewController alloc] init];
self.navigationController = [[MyCustomNavigationViewController alloc] initWithRootViewController:self.primaryViewController];
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];

// Present first view controller modally from base view controller
MyFirstModalViewController *firstModal = [[MyFirstModalViewController alloc] init];
MyCustomNavigationViewController *aNavigationController = [[MyCustomNavigationViewController alloc] initWithRootViewController:firstModal];
[aNavigationController.navigationBar setBarStyle:UIBarStyleBlack];
[self presentViewController:aNavigationController animated:YES completion:nil];

// Present second view controller modally from first view controller: On user tap on a button
MySecondModalViewController *secondModal = [[MySecondModalViewController alloc] init];
MyCustomNavigationViewController *aNavigationController = [[MyCustomNavigationViewController alloc] initWithRootViewController:secondModal];
[aNavigationController.navigationBar setBarStyle:UIBarStyleBlack];
[self presentViewController:aNavigationController animated:YES completion:nil];

【问题讨论】:

  • 我不确定这是否会导致问题,但您不应该在窗口中插入导航控制器的视图;将其添加为根视图控制器将其添加为您的子视图。您应该删除该行。否则,我在您的代码中看不到任何错误。您应该发布实际的错误消息。
  • @rdelmar 我已经添加了实际的控制台警告。此外,即使在窗口中删除导航控制器视图的插入后,警告仍然存在。
  • 我无法复制您的问题。您是否在视图控制器生命周期方法(viewDidLoad、viewWillAppear 等)中执行任何呈现或关闭视图控制器的操作?你有故事板吗?如果有,你有没有设置任何转场?
  • 我没有在任何视图初始化方法(如 viewWillAppear 等)中进行任何视图控制器演示。我没有使用情节提要,所有演示都是通过代码完成的。呈现新控制器的代码是在按钮处理程序中编写的。
  • 你也没有在代码中对任何控制器进行任何解散?

标签: ios objective-c iphone cocoa-touch uiviewcontroller


【解决方案1】:

如果您在问题中显示的代码与其在应用启动时运行的确切顺序完全相同,那是因为它试图在第一个模态未显示时为第二个模态视图控制器(呈现的第三个实际视图控制器)设置动画完成动画。

在这两行 - [self presentViewController:aNavigationController animated:YES completion:nil]; 设置动画:否。这将使这些视图立即出现,并可能消除您遇到的错误。

如果您需要动画,并且您需要像您编写的那样立即打开所有视图,那么您可能希望在调用第三个视图控制器(第二个模态)之前实现延迟。

你说你是从按钮调用这些视图?代码另有说明。

【讨论】:

  • 我提到的视图是在点击按钮时呈现的,不会一个接一个地自动呈现。因此,可以肯定的是,只有在呈现 VC 完全显示后,才会呈现一个 VC。我上面写的代码取自这些方法调用。诱导延迟或停止动画在这里也无济于事。
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2015-03-25
  • 2016-09-19
相关资源
最近更新 更多