iOS IBOutlet не ноль, каким-то образом очищается до нуля - PullRequest
0 голосов
/ 07 ноября 2018

TL; DR: у меня есть IBOutlet (UILabel), который правильно подключен в раскадровке. При доступе (распаковке) он отлично работает в viewDidLoad() ... но через несколько секунд его значение равно нулю. Точка наблюдения говорит, что розетка меняется сразу после вызова на viewDidLayoutSubviews(), , но ... a print() вызов в конце viewDidLayoutSubviews() показывает, что он не ноль.

Это очень похоже на IBOutlet равен nil , но его решение (значение дорожки с didSet()) не сработало. (Есть много связанных сообщений, но у всех были тривиальные решения.)

Что я сделал:

  • Переподключен выход к этикетке - с обеих сторон
  • Удалил ярлык и снова подключил его
  • Очистили проект
  • Удалил DerivedData
  • Выйти и перезапустить Xcode
  • Выйдите и перезапустите мой Mac
  • Добавлен метод didSet() в розетку.
    • Он срабатывает во время viewDidLoad() и показывает ненулевое значение.
    • В viewDidLoad() я установил текстовое значение без проблем
    • Он запускает , а не до сбоя с нулевым развёртыванием
  • Добавлена ​​точка наблюдения к переменной.
    • Этот вызывает срабатывание до сбоя (сразу после viewDidLayoutSubviews() и показывает следующее:

screenshot of Xcode debugger

Как упоминалось ранее, при выходе из самого последнего вызова метода перед точкой наблюдения (viewDidLayoutSubviews()) выход не равен нулю.

Эти сбои, кажется, всегда включают в себя подпредставления определенного суперпредставления. Я добавил точку наблюдения в розетку суперпредставления, но она никогда не срабатывает.

Что могло бы побудить мой код отпустить эту слабую ссылку?

1 Ответ

0 голосов
/ 08 ноября 2018

TL; DR: я забил соответствующие взгляды.

Ну, лучший способ найти свой ответ - спросить кого-то еще. Благодаря @DonMag я готовил больше следов, точек останова и снимков экрана. Я заметил этот метод (конечно, для исправления еще одной ошибки):

screen shot showing me removingFromSuperview the very views that were nil

Конечно, два представления, которые становились нулевыми, были подпредставлениями centralOverlay. Те, которые я хотел сохранить.

Так что, я думаю, мой ответ был похож на ответ IBOutlet равен nil - ошибка пилота - за исключением того, что обработчик didSet() не раскрыл тайну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...