2015-07-11 12 views
5

ho mantenere i riferimenti alla mia NSLayoutConstraintCome posso attivare il vincolo precedentemente disattivato?

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

poi per qualche @IBAction posso attivare/disattivare a seconda del mio flag variabile:

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

Ma quando chiamo ancora una volta la mia azione, ho un errore unexpectedly found nil while unwrapping an Optional value per myConstrain.

Altro su di esso non animato. Che cosa sto facendo di sbagliato?

seguo tutorial dal WWDC 2015:

enter image description here

+2

mantenere un riferimento forte dell'oggetto nella dichiarazione IBOutlet. '@IBOutlet strong var myConstraint: NSLayoutConstraint!' – Gandalf

+2

Il commento di Gandalf è corretto. la disattivazione di un vincolo deve far sì che la gerarchia delle viste ne rilasci la proprietà. se non si mantiene un riferimento forte, sarà deallocato. @ Gandalf, dovresti rendere questa una risposta in modo che l'OP possa accettarla. –

risposta

14

Disattivazione di un vincolo è lo stesso di chiamare removeConstraint: per una vista. Fare riferimento allo documentation. Quindi, quando si rimuove un oggetto che ha il riferimento weak causerà la deallocazione dell'oggetto per esso. Ora questo oggetto è nil e l'attivazione non avrà alcun effetto. Per risolvere il problema è necessario avere un forte riferimento all'oggetto vincolo.

@IBOutlet strong var myConstraint: NSLayoutConstraint! 
+0

Perché non c'è animazione quando cambio questo? –

+1

Oh, lo so, dovrei aggiungere 'self.view.layoutIfNeeded()' –

+0

IDE dà errore se si tenta di rendere un IBOutlet debole forte. – SanjayPathak

Problemi correlati