返回主视图控制器时出现“仍需要自动布局…”崩溃

6
我的应用程序启动时会显示一个主菜单,它是UIViewController的一个自定义子类,名为LVSMainViewController。它嵌入在UINavigationController中,并被设置为storyboard中的初始VC。LVSMainViewController实现了-viewDidLayoutSubviews。
点击按钮会将用户带到应用程序的不同部分(另一个VC)。用户通过连接到推送segue的按钮返回到主菜单。但是当应用程序再次加载主菜单VC时,它会崩溃并显示以下消息:
2014-08-28 16:11:14.122 * Assertion failure in -[UIView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8803 2014-08-28 16:11:14.257 * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after sending -viewDidLayoutSubviews to the view controller. LVSMainViewController's implementation needs to send -layoutSubviews to the view to invoke auto layout.'

其他SO帖子报告说,当以编程方式设置自动布局约束时会出现相同的错误(尽管我没有这样做,但我在storyboard中使用了自动布局),并且/或者在使用UITableView时也会出现此问题(虽然我在主菜单VC或其segue到的VC中都没有使用它,但我在应用程序的其他地方使用了它)。 (请参见此处此处。)

谜题的其他部分:

  1. 我尝试在 -viewDidLayoutSubviews 的末尾添加 [self.view layoutSubviews];。这样做不会导致崩溃。但是,这似乎是不明智的,因为Apple的文档说:

    您不应直接调用此方法。如果要强制进行布局更新,请先调用 setNeedsLayout 方法以在下一次绘制更新之前执行此操作。

  2. 如果我在 -viewDidLayoutSubviews 的末尾改为添加 [self.view setNeedsLayout];,则应用程序会在首次加载主菜单 VC 时崩溃,而不是当我离开并返回时。

可能是什么原因引起的??


你的 viewDidLayoutSubviews 的代码是什么? - fluidsonic
@fluidsonic 我刚刚检查了一下,现在在XCode 6.0.1下已经可以正常工作了。我认为这可能是早期版本中的一个错误。 - LarrySnyder610
2个回答

14

崩溃“神奇”地被修复的原因可能是您现在正在使用iOS 8。 您尝试在iOS 7上运行此代码了吗?

通过调用[self.view layoutSubviews],您已经接近答案。

尝试改为调用[self.view layoutIfNeeded]

请参见以下文章:

Autolayout and subviews

Auto Layout error


谢谢,这些帖子很有帮助。但是正如我所说,代码现在运行良好,所以我不会再去调整它。 - LarrySnyder610
@grendelsdad 你尝试在iOS 7.x设备上使用过这个应用吗?我相信这个解决方案是正确的。 - iosCurator

-4

Xcode 6.0.1 神奇地修复了崩溃问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接