2017-01-11 3 views
0

Я заметил, что в некоторых случаях после того, как я установил isActive = false для ограничения в Swift, когда при попытке получить к нему доступ позже он равен нулю, но это не всегда так. В одной ситуации у меня было два контроллера представления, и оба были установлены isActive на false в ограничении в viewWillAppear, но в одном представлении ограничение было доступно позже, и я мог установить isActive = true, а в другом - nil.Когда iOS удаляет неактивные ограничения

Что может вызывать такое поведение? Я смог обойти это, установив приоритет вместо 1 или 900 вместо этого, но он все еще оставляет вопрос о том, что на самом деле происходит в фоновом режиме.

ответ

5

isActive не очень хорошее название. Ограничение фактически не деактивировано, оно удалено из иерархии представлений.

Если представление имело только сильную ссылку на ограничение, ограничение будет освобождено, и вы не сможете его активировать снова.

Это означает, что если вы хотите, чтобы ограничение будет храниться в памяти, вы должны ссылаться на него сильно, например:

@IBOutlet var myConstraint: NSLayoutConstraint! 

не

@IBOutlet weak var myConstraint: NSLayoutConstraint? 

Если вы держите сильную ссылку, то ссылка никогда не будет установлена ​​на nil, если вы не установите ее на nil самостоятельно.

+0

Мои ограничения заданы в коде и массивах, поэтому я никогда не знал этого. Тем не менее, мой урок сегодня был таким. Up-голосование. – dfd

+0

А, это объясняет это. Спасибо, @ Султан! –

Смежные вопросы