【发布时间】:2014-11-06 11:25:41
【问题描述】:
目前我遇到了一种奇怪的行为。我从viewForHeaderInSection 的视图中删除了自动调整大小掩码。当我这样做时,应用程序崩溃了,因为我试图删除一个为 nil 的约束。
我正在父控制器的viewDidLoad 中创建相关约束。在调试模式下,我发现当系统尝试创建一个涉及我的子视图控制器的约束(它从部分标题视图中删除了自动调整大小掩码)时,它直接跳转到updateViewConstraints。当然,约束是 nil,因为尚未创建。
- 如果我再次添加自动调整大小蒙版,应用程序可以正常工作,但我无法做我想做的事情(正确布局我的视图)。
- 如果我在
updateViewConstraints中创建约束,该应用程序也可以工作。
我不明白为什么会这样。在类似的视图控制器上,它可以正常工作。有时我认为自动布局比收益更痛苦。出现服务器错误时会显示警报。在这里可以正确加载视图。看来这是一种时间问题。
我想知道为什么会发生这种情况,以及将来我应该如何处理以使此类错误不再发生。我做错了吗?
编辑:
不知道它是否有帮助,但如果我在我父母的 viewDidLoad 中的子视图控制器的视图上调用 setNeedsLayout 和 layoutIfNeeded,那么应用程序也会崩溃。
编辑 2:
似乎当我将多个具有不同位置约束的视图添加到我的视图控制器时会发生这种情况。对于我的表,如果当前没有条目,我会添加一条空消息。如果我不将标签作为子视图添加到我的表中,一切正常。
那么当我被允许添加我的约束时?目前,我在将视图添加为子视图后立即添加它们。对于空消息,它在viewDidLoad 中,对于部分标题,它是viewForHeaderInSection。我必须使用setNeedsLayout之类的东西吗?
编辑 3:
向表格视图添加子视图根本不是一个好主意(尤其是在使用自动布局时)。目前我正在使用背景视图,但这不是我正在寻找的解决方案。
【问题讨论】:
-
我对这个问题感到困惑。在第一段中,您说您正在尝试删除自动调整大小的蒙版……如果您不想要蒙版,为什么要首先添加它?然后你说应用崩溃是因为你试图移除一个缺失的约束……你为什么要试图移除一个不存在的约束?
-
感谢您的回复。默认情况下启用自动调整大小掩码。当我想使用自动布局时,我必须禁用它(
translatesAutoresizingMaskIntoConstraints设置为NO)。约束不存在,因为他没有在viewDidLoad中完成创建它。当他想创建它时,他直接跳到updateViewConstraints而不是创建我的约束... -
很抱歉,不,默认情况下不启用自动调整大小的蒙版。如果您以编程方式创建 UIView,它将没有设置自动调整大小的掩码,如果您在 xib/storyboard 文件中创建视图并在其中使用约束,则无法访问自动调整大小的掩码来打开它们。
-
我正在以编程方式创建我的视图 :-) 感谢您的澄清。
标签: ios autolayout