我注意到在某些情况下我在Swift中的一个约束上设置isActive = false后,当我稍后尝试访问它时它是nil,但情况并非总是如此。在一种情况下,我有两个视图控制器,并且在viewWillAppear中的约束上都设置isActive为false,但是在一个视图中,约束稍后可用,我可以设置isActive = true而在另一个视图中它是nil。
什么会导致这种行为?通过将优先级设置为1或900,我能够绕过它,但它仍然留下了背景中真正发生的事情的问题。
答案 0 :(得分:9)
isActive
不是一个非常好的属性名称。约束实际上未被停用,它从视图层次结构中被删除。
如果视图对约束有唯一的强引用,则约束将被取消分配,您将无法再次激活它。
这意味着如果您希望将约束保留在内存中,则必须强烈引用它,例如:
@IBOutlet var myConstraint: NSLayoutConstraint!
不
@IBOutlet weak var myConstraint: NSLayoutConstraint?
如果您保留强大的引用,则除非您自己将引用设置为nil
,否则引用永远不会设置为nil
。