2015-07-11 40 views
5

Trzymam odniesień do mojego NSLayoutConstraintJak mogę aktywować, wcześniej dezaktywować wiązanie?

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

potem przez jakiś @IBAction mogę włączyć/wyłączyć w zależności od mojego flag zmiennej:

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

Ale kiedy po raz kolejny zadzwonić do mojego działania, mam błąd unexpectedly found nil while unwrapping an Optional value dla myConstrain.

Więcej o tym nie animuje. Co ja robię źle?

śledzę samouczek z WWDC 2015:

enter image description here

+2

zachować silne odniesienie do obiektu w deklaracji IBOutlet. '@IBOutlet strong var myConstraint: NSLayoutConstraint!' – Gandalf

+2

Komentarz Gandalfa jest poprawny. dezaktywacja ograniczenia musi spowodować, że hierarchia widoku zwolni jego własność. jeśli nie utrzymasz silnego odniesienia, zostanie ono zwolnione. @Gandalf, powinieneś to zrobić, aby OP mógł to zaakceptować. –

Odpowiedz

14

Dezaktywacja ograniczenie jest takie same jak wywołanie removeConstraint: dla widoku. Patrz: documentation. Więc kiedy usuniesz obiekt, który ma wartość weak, spowoduje to deallokację obiektu. Teraz ten obiekt to nil, a aktywacja go nie będzie miała żadnego efektu. Aby rozwiązać problem, musisz mieć silne odniesienie do obiektu więzów.

@IBOutlet strong var myConstraint: NSLayoutConstraint! 
+0

Dlaczego nie ma animacji, kiedy to zmienię? –

+1

Och, wiem, powinienem dodać 'self.view.layoutIfNeeded()' –

+0

IDE daje błąd, jeśli próbujesz sprawić, że słaby IBOutlet będzie silny. – SanjayPathak