Почему слабый 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
Другие вопросы по тегам