2015-07-11 35 views
5

我一直引用我NSLayoutConstraint如何激活先前禁用的約束?

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

那麼對於一些@IBAction我激活/停用根據我的flag變量:

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

但是,當我再次打電話給我的動作,我有一個錯誤unexpectedly found nil while unwrapping an Optional valuemyConstrain

更多關於它不動畫。我究竟做錯了什麼?

我按照教程從2015年WWDC:

enter image description here

+2

在IBOutlet聲明中保留對象的強引用。 '@IBOutlet strong var myConstraint:NSLayoutConstraint!' – Gandalf

+2

甘道夫的評論是正確的。取消激活約束必須使視圖層次結構釋放它的所有權。如果你不保留一個強有力的參考,它將被釋放。 @Gandalf,你應該讓這個答案讓OP能夠接受它。 –

回答

14

停用約束與調用removeConstraint:的視圖。請參閱documentation。所以當你刪除一個具有weak引用的對象時,會導致對象重新分配它。現在這個對象是nil並且激活它根本沒有任何效果。爲了解決這個問題,你需要強有力的引用約束對象。

@IBOutlet strong var myConstraint: NSLayoutConstraint! 
+0

爲什麼當我改變它時沒有動畫? –

+1

哦,我知道,我應該加上'self.view.layoutIfNeeded()' –

+0

IDE如果你試圖讓一個IBOutlet中弱強給人錯誤。 – SanjayPathak