Search code examples
iosswiftnslayoutconstraintwwdc

How can I activate, previously deactivated constraint?


I keep references to my NSLayoutConstraint

var flag = true
@IBOutlet weak var myConstraint: NSLayoutConstraint!

Then for some @IBAction I activate/deactivate depending on my flag variable:

@IBAction func tapped(sender: UIButton) {
    flag = !flag
    UIView.animateWithDuration(1.0) {
        if self.flag {
            NSLayoutConstraint.activateConstraints([self. myConstraint])
        } else {
            NSLayoutConstraint.deactivateConstraints([self. myConstraint])
        }
    }
}

But when I call my action once again, I have an error unexpectedly found nil while unwrapping an Optional value for myConstrain.

More over it doesn't animate. What am I doing wrong?

I follow tutorial from WWDC 2015:

enter image description here


Solution

  • Deactivating a constraint is same as calling removeConstraint: for a view. Refer the documentation. So when you remove an object which has weak reference will cause the object deallocation for it. Now this object is nil and activating it won't have any effect at all. To solve the issue you need to have a strong reference to constraint object.

    @IBOutlet strong var myConstraint: NSLayoutConstraint!