2015-07-11 19 views
5

Ich halte Verweise auf meine NSLayoutConstraintWie kann ich zuvor deaktivierte Constraint aktivieren?

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

Dann für einige @IBAction ich aktivieren/deaktivieren je nach meinen 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]) 
     } 
    } 
} 

Aber wenn ich noch einmal meine Aktion nennen, ich habe einen Fehler unexpectedly found nil while unwrapping an Optional value für .

Mehr darüber animiert nicht. Was mache ich falsch?

Ich folge Tutorial von WWDC 2015:

enter image description here

+2

behalten Sie eine starke Referenz des Objekts in IBOutlet-Deklaration. '@IBOutlet stark var myConstraint: NSLayoutConstraint!' – Gandalf

+2

Gandalfs Kommentar ist korrekt. Durch das Deaktivieren einer Einschränkung muss die Ansichtshierarchie ihre Eigentümerschaft freigeben. Wenn Sie keine starke Referenz beibehalten, wird die Zuordnung aufgehoben. @ Gandalf, du solltest dies eine Antwort machen, damit das OP es akzeptieren kann. –

Antwort

14

eine Einschränkung deaktivieren als removeConstraint: für eine Ansicht gleichen Aufruf. Siehe die documentation. Wenn Sie also ein Objekt entfernen, das die Referenz weak enthält, wird die Objektfreigabe für das Objekt ausgelöst. Jetzt ist dieses Objekt nil und die Aktivierung hat keinerlei Auswirkungen. Um das Problem zu lösen, benötigen Sie einen starken Verweis auf das Constraint-Objekt.

@IBOutlet strong var myConstraint: NSLayoutConstraint! 
+0

Warum gibt es keine Animation, wenn ich das ändere? –

+1

Oh, ich weiß, ich sollte hinzufügen 'self.view.layoutIfNeeded()' –

+0

IDE gibt Fehler, wenn Sie versuchen, eine schwache IBOutlet stark zu machen. – SanjayPathak

Verwandte Themen