2016-06-27 21 views
9

Ho un IBOutlet NSLayoutConstraint nella mia app. Molto semplice:Perché debole IBOutlet NSLayoutConstraint diventa nullo quando lo faccio inattivo?

@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint; 

Ad un certo punto che voglio disattivare questo vincolo:

self.leftConstraint.active = NO; 

Succede in un metodo chiamato da cellForRowAtIndexPath:. E il vincolo diventa nullo subito dopo la riga sopra. Tuttavia se dichiaro questa proprietà come strong allora è ok, non diventa nulla. Qualcuno può spiegare perché succede?

risposta

28

Quando la presa è weak, l'unico riferimento strong è dalla proprietà constraints della vista. Disattivando il vincolo lo rimuove da quella matrice, quindi non ci sono più riferimenti forti.

+0

Elementare, Watson))) Grazie mille! –

+0

La stessa conclusione che ho raggiunto, ma è sicuro renderlo forte? Il mio vincolo è in una cella di visualizzazione della raccolta e sono preoccupato che tenere il riferimento forte creerà un ciclo di conservazione quando le celle vengono riciclate. – Echelon

+0

@Echelon, a cui non è possibile rispondere senza sapere di più sulle relazioni di classe. Tuttavia, i cicli sono OK finché c'è un punto chiaro in cui sono rotti. – Avi

2

Una possibile soluzione potrebbe essere quella di modificare la priorità vincolo anziché rendendolo inattivo:

@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint; 
(...) 
self.leftConstraint.priority = 250; 

Poi, self.leftConstraint non è disposto.

EDIT:

Xcode non supporta la modifica di priorità per il termine (= 1000) vincoli, in modo da essere sicuri di passare in un range compreso tra 1 ... 999.

Problemi correlati