Ответ
Аутлеты (@IBOutlet) остаются nil, когда связь между кодом и элементом интерфейса в Storyboard/XIB не установлена или разорвана.
Распространенные причины:
-
Отсутствует аннотация
@IBOutletв коде.// ОШИБКА: Свойство не помечено как IBOutlet var myLabel: UILabel? // ПРАВИЛЬНО: Связь может быть установлена @IBOutlet weak var myLabel: UILabel! -
Нет связи в Interface Builder. Элемент на storyboard не подключен к свойству в коде (или подключен к другому свойству).
-
Несоответствие имен. Имя свойства в коде не совпадает с именем аутлета в Interface Builder.
-
Элемент UI удален из storyboard, но ссылка в коде осталась.
-
Попытка доступа до загрузки view. Аутлеты инициализируются в момент загрузки view (
loadView()/viewDidLoad). Обращение к ним раньше (например, вinit) вернетnil.override func viewDidLoad() { // ОШИБКА: myLabel еще nil, т.к. super.viewDidLoad() не вызван // myLabel.text = "Hello" super.viewDidLoad() // Здесь загружаются аутлеты // ПРАВИЛЬНО: Теперь myLabel загружен myLabel.text = "Hello" } -
Использование
strongвместоweakссылки (редко, но может мешать освобождению памяти).
Решение: Проверить связи в Interface Builder (правая панель, раздел "Connections Inspector") и убедиться, что view контроллера загружена.