导航控制器在关闭视图控制器时崩溃

Posted

技术标签:

【中文标题】导航控制器在关闭视图控制器时崩溃【英文标题】:Nav Controller crashes on dismiss view controller 【发布时间】:2014-06-21 16:16:57 【问题描述】:

在我的应用中发生解雇时,我收到 2 个错误。 Warning: Attempt to dismiss from view controller <MyNavigationController> while a presentation or dismiss is in progress! & Unbalanced calls to begin/end appearance transitions for <MainViewController>.

我四处搜索,到处都说通常会发生冲突的解除,即按钮以编程方式和通过情节提要调用转换。但是,我在使用导航控制器附带的正常后退按钮时收到这些错误。我根本不会对按钮做任何事情。

我唯一可以链接到错误的是我的导航控制器在尝试关闭视图控制器时自动旋转。如果我删除自动旋转或将两个视图控制器的方向设置为相同,那么我不会收到错误消息。问题是,我需要一个视图控制器是纵向的,另一个是横向的......

这就是我设置方向的方式

NavController.m:

- (NSUInteger)supportedInterfaceOrientations 
    return self.topViewController.supportedInterfaceOrientations;


- (BOOL)shouldAutorotate 
    return YES;

MainViewController.m:

- (NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationMaskPortrait;

OtherViewController.m:

- (NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationMaskLandscapeRight;

我注意到由于某种原因它在转到我的“OtherViewController”时没有自动旋转,但它显然在返回“MainViewController”时尝试自动旋转,从而导致崩溃。

因为它可能是相关的,这就是我加载我的 OtherViewController 的方式:

[self performSegueWithIdentifier:titles[indexPath.row] sender:nil];

我有一个 CollectionViewController 调用我在情节提要中设置的推送序列。 Titles 是连接到 MainViewController 的不同 segue 标题的 NSArray。

这是我的应用程序中发生的事情的流程:

MainViewController  : LoadView
MainViewController  : ViewWillAppear
MainViewController  : ViewDidAppear
//This is where I choose to load the OtherViewController
OtherViewController : LoadView
MainViewController  : ViewWillDisappear
OtherViewController : ViewWillAppear
MainViewController  : ViewDidDisappear
OtherViewController : ViewDidAppear
//This is where I select the "Back" button
Warning: Attempt to dismiss from view controller NavController while a presentation or dismiss is in progress!
Unbalanced calls to begin/end appearance transitions for MainViewController.
MainViewController  : ViewWillDisappear
MainViewController  : ViewDidDisappear

【问题讨论】:

将此添加到您的代码中: NSLog(@"%@",[self.navigationController viewControllers]);并告诉我它打印出来的内容。 (MyMainViewController, OtherViewController) 应该有的两个视图控制器都在那里 【参考方案1】:

为了进行详细分析,我们需要更多代码,尤其是在视图控制器被解除的情况下。

至于您的错误消息,无论您使用哪个解除调用,都会在显示或解除视图控制器的其他一些工作流程的中间调用。这可能是当您呈现或关闭模式视图控制器时,或者当您在导航堆栈中推送或弹出一个时

加载视图 viewDidLoad viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear

这个列表肯定是不完整的,但这应该是进程中最常用的方法。

所以与我们分享更多代码。

【讨论】:

我将 cmets 放入您建议的所有内容中,看来我在 ViewDidDisappear 中的日志输出从未被记录。所以我的 OtherViewController 甚至没有被告知消失...... ViewWillAppear 和 LoadView 也没有在我的 MainViewController 上调用 我确实注意到了一些奇怪的事情。收到这两个错误后,MainViewControllers 调用 ViewWillDisappear 和 ViewDidDisappear.. 调用 ...With... 和 ...Did... 没有什么奇怪的。这不是一个顺序问题,您可以利用它。【参考方案2】:

无需过多介绍细节,您需要找到一种方法来另一个之后进行。棘手的部分是没有代表告诉您view 在转场后何时被解雇。然而,在转场之后,当viewWillAppear 被调用时,之前的view 被解雇了。 也许尝试从代码中旋转view,并在viewWillAppear 中这样做?

【讨论】:

我能够强制旋转的唯一方法是通过 this answer 稍微调整一下以像 this person did 一样工作,但这所做的只是在转到我的 OtherViewController 时进行自动旋转工作。返回我的 MainViewController 时它仍然有同样的崩溃

以上是关于导航控制器在关闭视图控制器时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

尝试在导航控制器中嵌入视图控制器时 Xcode6-Beta 崩溃

关闭 ZXingWidgetController 后在导航控制器中显示视图

在执行功能时单击导航控制器上的后退按钮时应用程序崩溃

将模态视图控制器解散回嵌入在 TabBarController 中的导航控制器堆栈导致崩溃

嵌入导航控制器后应用程序崩溃

导航控制器发布崩溃应用