2016-06-27 15 views
9

Mam IBOutlet NSLayoutConstraint w mojej aplikacji. Bardzo proste:Dlaczego słaba wartość IBOutlet NSLayoutConstraint zmienia się na zero, gdy sprawię, że stanie się ona nieaktywna?

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

W pewnym momencie chcę wyłączyć to ograniczenie:

self.leftConstraint.active = NO; 

Zdarza w metodzie zwanej od cellForRowAtIndexPath:. Ograniczenie staje się zerowe zaraz po linii powyżej. Jeśli jednak zadeklaruję tę właściwość jako strong, oznacza to, że nie jest ona zerem. Czy ktoś może wyjaśnić, dlaczego tak się dzieje?

Odpowiedz

28

Kiedy twój wylot to weak, jedyne odniesienie strong pochodzi z właściwości widoku widoku constraints. Dezaktywacja ograniczenia usuwa ją z tej tablicy, więc nie ma już silniejszych odniesień.

+0

Elementary, Watson))) Wielkie dzięki! –

+0

Doszedłem do tego samego wniosku, ale czy można go bezpiecznie wzmocnić? Moje ograniczenie jest w komórce widoku kolekcji i obawiam się, że przytrzymanie silnego ref spowoduje utworzenie cyklu zatrzymania, gdy komórki zostaną poddane recyklingowi. – Echelon

+0

@Echelon, na które nie można odpowiedzieć, nie wiedząc więcej o twoich relacjach w klasie. Jednak cykle są w porządku, o ile istnieje wyraźny punkt, w którym są zepsute. – Avi

2

Możliwe obejście byłoby zmienić priorytet wiązania zamiast co nieaktywna:

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

Następnie self.leftConstraint nie jest umieszczona.

EDIT:

Xcode nie obsługuje zmianę priorytetu wymagane (= 1000) ograniczeń, więc należy przełączyć się w przedziale między 1 ... 999.

Powiązane problemy