iOS何时删除非活动约束

时间:2017-01-11 16:59:13

标签: ios autolayout

我注意到在某些情况下我在Swift中的一个约束上设置isActive = false后,当我稍后尝试访问它时它是nil,但情况并非总是如此。在一种情况下,我有两个视图控制器,并且在viewWillAppear中的约束上都设置isActive为false,但是在一个视图中,约束稍后可用,我可以设置isActive = true而在另一个视图中它是nil。

什么会导致这种行为?通过将优先级设置为1或900,我能够绕过它,但它仍然留下了背景中真正发生的事情的问题。

1 个答案:

答案 0 :(得分:9)

isActive不是一个非常好的属性名称。约束实际上未被停用,它从视图层次结构中被删除

如果视图对约束有唯一的强引用,则约束将被取消分配,您将无法再次激活它。

这意味着如果您希望将约束保留在内存中,则必须强烈引用它,例如:

@IBOutlet var myConstraint: NSLayoutConstraint!

@IBOutlet weak var myConstraint: NSLayoutConstraint?

如果您保留强大的引用,则除非您自己将引用设置为nil,否则引用永远不会设置为nil