ios objective-c uikit iboutlet ios-autolayout

ios - ¿Por qué el débil IBOutlet NSLayoutConstraint se convierte en nulo cuando lo desactivo?



objective-c uikit (3)

Cuando su salida es weak , la única referencia strong proviene de la propiedad de constraints de la vista. Desactivar la restricción lo elimina de esa matriz, por lo que no hay más referencias seguras.

Tengo un IBOutlet NSLayoutConstraint en mi aplicación. Muy simple:

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

En algún momento quiero desactivar esta restricción:

self.leftConstraint.active = NO;

Sucede en un método llamado de cellForRowAtIndexPath: Y la restricción se vuelve nula justo después de la línea de arriba. Sin embargo, si declaro que esta propiedad es strong entonces está bien, no pasa a ser nula. ¿Alguien puede explicar por qué sucede?


Primero cambia la variable IBOutlet a un opcional. es decir:

desde :

@IBOutlet weak var myConstraint : NSLayoutConstraint!

a:

@IBOutlet weak var myConstraint : NSLayoutConstraint?

Ahora, para facilitar la administración / cambio desde el guión gráfico en el futuro, agregue una nueva variable (por ejemplo, myConstraint_DefualtValue ) y establezca esto en el valor de myConstraint en viewDidLoad

var myConstraint_DefualtValue = CGFloat(0) override func viewDidLoad() { super.viewDidLoad() self.myConstraint_DefualtValue = self.myConstraint.constant }

Supongo que es obvio por qué necesita configurarlo en viewDidLoad y no en otro lugar

Entonces cuando quieras desactivarlo:

self.myConstraint?.isActive = false

Y cuando quiera reactivarlo (asumiendo que tiene la vista como una salida ( myViewThatHasTheConstraint ) y la restricción es una restricción de altura ):

self.myConstraint = self.myViewThatHasTheConstraint.heightAnchor.constraint(equalToConstant: self.myConstraint_DefualtValue); self.myConstraint?.isActive = true


Una posible solución sería cambiar la prioridad de la restricción en lugar de desactivarla:

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

Entonces, self.leftConstraint no se elimina.

EDITAR:

Xcode no admite cambios de prioridad para las restricciones requeridas (= 1000), así que asegúrese de cambiar en un rango entre 1 ... 999.