我的应用程序启动时会显示一个主菜单,它是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.'
点击按钮会将用户带到应用程序的不同部分(另一个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中都没有使用它,但我在应用程序的其他地方使用了它)。 (请参见此处或此处。)
谜题的其他部分:
我尝试在
-viewDidLayoutSubviews
的末尾添加[self.view layoutSubviews];
。这样做不会导致崩溃。但是,这似乎是不明智的,因为Apple的文档说:您不应直接调用此方法。如果要强制进行布局更新,请先调用 setNeedsLayout 方法以在下一次绘制更新之前执行此操作。
如果我在
-viewDidLayoutSubviews
的末尾改为添加[self.view setNeedsLayout];
,则应用程序会在首次加载主菜单 VC 时崩溃,而不是当我离开并返回时。
可能是什么原因引起的??
viewDidLayoutSubviews
的代码是什么? - fluidsonic