NSLayoutConstraint 仅在切换视图控制器时出错

Posted

技术标签:

【中文标题】NSLayoutConstraint 仅在切换视图控制器时出错【英文标题】:NSLayoutConstraint errors only when switching view controllers 【发布时间】:2015-04-11 15:55:30 【问题描述】:

我的一个视图控制器出现了一些非常奇怪的行为。

我正在从不同选项卡中的两个不同UITableViews 导航到同一个控制器(具有不同的实例)。

当它通过点击UITableViewCell 显示时,一切都很好,没有错误显示。如果我打开控制器并通过选择另一个选项卡离开它,然后通过按原始选项卡导航回到它,我会收到大量 NSLayoutConstraint 错误。

我的单元格中实际上没有任何约束,并且故事板中单元格的内容视图上没有任何 UI 元素,因为我正在以编程方式添加所有这些元素。我也没有在代码中定义任何约束。

完整的错误是 here,因为它太大而无法合理地粘贴到 SO。

摘录如下:

2015-04-11 16:49:23.889 TradingPost[6982:60b] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSLayoutConstraint:0x155e5250 H:[UILabel:0x155d8150(158)]>",
"<NSLayoutConstraint:0x155ed9e0 H:|-(8)-[UILabel:0x155d8150]   (Names: '|':UITableViewCellContentView:0x155d4a80 )>",
"<NSLayoutConstraint:0x155eda30 H:[UILabel:0x155d8150]-(47)-[UIView:0x155e01a0]>",
"<NSLayoutConstraint:0x155f1bc0 UIView:0x155e01a0.trailing == UITableViewCellContentView:0x155d4a80.trailing - 8>",
"<NSAutoresizingMaskLayoutConstraint:0x156b7640 h=--& v=--& H:[UITableViewCellContentView:0x155d4a80(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x155e5250 H:[UILabel:0x155d8150(158)]>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

补充:经过进一步调查,我发现我仍然遇到错误,即使我从控制器中删除了所有 UI 生成代码并从情节提要中删除了所有约束。在这一点上,我怀疑巫术。

【问题讨论】:

您是否检查/设置了所涉及视图的translatesAutoresizingMaskIntoConstraints 的值? 【参考方案1】:

即使您没有显式创建任何约束,自动布局系统也可以从与每个视图关联的autoresizingMask 掩码创建它们。您可以尝试将translatesAutoresizingMaskIntoConstraints 设置为NO。但是,如果您使用自动布局和尺寸类来创建适应各种屏幕尺寸的界面,您可能需要接受约束。在这种情况下,您最好在代码中明确设置相关约束。

【讨论】:

将元素的translatesAutoresizingMaskIntoConstraints设置为NO后第一次切换到视图,没有报错。但在那之后的每一次(包括当我关闭并重新打开应用程序时),我都会收到错误。 经过更多调查,我完全不知道是什么导致了错误。即使我从控制器中删除所有 UI 代码,错误仍然出现。【参考方案2】:

我发现附加到我认为导致问题的视图的另一个视图是问题的实际原因。

它所需要的只是重置约束来修复它,当我遇到这个问题时我完全忘记了它。

【讨论】:

以上是关于NSLayoutConstraint 仅在切换视图控制器时出错的主要内容,如果未能解决你的问题,请参考以下文章

调整 UITableViewCell 大小的 NSLayoutConstraint 错误

NSLayoutConstraint - 无法将子视图框架设置为父视图边界

NSLayoutConstraint 后子视图中的 UIButton 未收到触摸

NSLayoutConstraint 将视图固定到父视图的底部边缘

导航栏和 ViewControllers 视图之间的 NSLayoutConstraint

NSLayoutConstraint 子视图不会自动调整大小以适应容器视图