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.