2016-06-27 4 views
9

Ich habe eine IBOutlet NSLayoutConstraint in meiner App. Ganz einfach:Warum schwach IBOutlet NSLayoutConstraint wird zu Null, wenn ich es inaktiv mache?

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

Irgendwann möchte ich diese Einschränkung deaktivieren:

self.leftConstraint.active = NO; 

kommt es vor, in einem Verfahren von cellForRowAtIndexPath: genannt. Und die Beschränkung wird gleich nach der obigen Zeile gleich Null. Aber wenn ich diese Eigenschaft als strong deklariere, dann ist es in Ordnung, es wird nicht zu Null. Kann jemand erklären, warum es passiert?

Antwort

28

Wenn Ihre Steckdose weak ist, ist die einzige strong Referenz aus der Ansicht constraints Eigenschaft. Wenn Sie die Einschränkung deaktivieren, wird sie aus diesem Array entfernt, sodass keine starken Referenzen mehr vorhanden sind.

+0

Elementary, Watson))) Vielen Dank! –

+0

Die gleiche Schlussfolgerung, die ich erreicht habe, aber ist es sicher, sie stark zu machen? Meine Einschränkung ist in einer Sammlungsansichtszelle und ich bin besorgt, dass das Halten der starken Referenz einen Aufbewahrungszyklus erzeugen wird, wenn Zellen recycelt werden. – Echelon

+0

@Echelon, das kann nicht beantwortet werden, ohne mehr über Ihre Klassenbeziehungen zu wissen. Zyklen sind jedoch in Ordnung, solange es einen klaren Punkt gibt, wo sie gebrochen sind. – Avi

2

Eine mögliche Abhilfe wäre die Einschränkung Priorität es inaktiv zu machen, anstatt zu ändern:

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

Dann wird self.leftConstraint nicht angeordnet ist.

EDIT:

Xcode unterstützt keine Priorität ändert für erforderlich (= 1000) Einschränkungen, so sicherzustellen, dass Sie in einem Bereich wechseln zwischen 1 ... 999.

Verwandte Themen