Почему слабый IBOutlet NSLayoutConstraint превращается в ноль, когда я делаю его неактивным?
У меня есть IBOutlet NSLayoutConstraint
в моем приложении. Очень просто:
@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint;
В какой-то момент я хочу деактивировать это ограничение:
self.leftConstraint.active = NO;
Это происходит в методе, вызываемом из cellForRowAtIndexPath:
, И ограничение становится нулевым сразу после строки выше. Однако, если я объявлю это свойство как strong
тогда все в порядке, это не превращается в ноль. Кто-нибудь может объяснить, почему это происходит?
3 ответа
Когда ваша розетка weak
, единственный strong
ссылка с точки зрения constraints
имущество. Деактивация ограничения удаляет его из этого массива, поэтому больше нет сильных ссылок.
Возможный обходной путь - изменить приоритет ограничения, а не делать его неактивным:
@property (nonatomic, weak) IBOutlet NSLayoutConstraint* leftConstraint;
(...)
self.leftConstraint.priority = 250;
Тогда self.leftConstraint не удаляется.
РЕДАКТИРОВАТЬ:
Xcode не поддерживает изменение приоритета для требуемых (=1000) ограничений, поэтому убедитесь, что вы переключаетесь в диапазоне от 1 до 999.
Сначала измените переменную IBOutlet на необязательную. то есть:
от:
@IBOutlet weak var myConstraint : NSLayoutConstraint!
чтобы:
@IBOutlet weak var myConstraint : NSLayoutConstraint?
Теперь, чтобы упростить управление / изменение раскадровки в будущем, добавьте новую переменную (например, myConstraint_DefualtValue) и установите для нее значение myConstraint в viewDidLoad
var myConstraint_DefualtValue = CGFloat(0)
override func viewDidLoad() {
super.viewDidLoad()
self.myConstraint_DefualtValue = self.myConstraint.constant
}
Я предполагаю, это очевидно, почему вам нужно установить его в viewDidLoad, а не где-то еще
Затем, когда вы хотите деактивировать его:
self.myConstraint?.isActive = false
И когда вы хотите повторно активировать его (при условии, что у вас есть представление как выход (myViewThatHasTheConstraint), а ограничение - ограничение высоты):
self.myConstraint = self.myViewThatHasTheConstraint.heightAnchor.constraint(equalToConstant: self.myConstraint_DefualtValue);
self.myConstraint?.isActive = true