В соответствии с ссылка NSObject UIKit дополнений, выходные переменные должны быть установлены к моменту времени awakeFromNib
(выделение все мое):
Инфраструктура nib-load отправляет сообщение awakeFromNib каждому объекту, воссозданному из архива nib, но только после того, как все объекты в архиве были загружены и инициализированы. Когда объект получает сообщение awakeFromNib, гарантировано, что все его соединения для выхода и действия уже установлены.
...
Важно. Поскольку порядок, в котором объекты создаются из архива, не гарантируется, ваши методы инициализации не должны отправлять сообщения другим объектам в иерархии. Сообщения для других объектов могут быть отправлены безопасно из метода awakeFromNib.
Как правило, вы реализуете awakeFromNib для объектов, для которых требуется дополнительная настройка, которая не может быть выполнена во время разработки. Например, вы можете использовать этот метод для настройки конфигурации по умолчанию для любых элементов управления в соответствии с предпочтениями пользователя или значениями в других элементах управления. Вы также можете использовать его для восстановления отдельных элементов управления в каком-либо предыдущем состоянии вашего приложения.
Однако это не соответствует моим тестам, по крайней мере, с использованием раскадровки. Результаты следующего теста, похоже, противоречат документации:
- Создайте новое приложение Single View в Xcode.
- Перетащите второй ViewController на раскадровку.
- Дайте первой кнопке ViewController a и создайте modal segue с этой кнопки, которая отобразит второй ViewController.
- Создайте файл класса ViewController для второго ViewController.
- Создайте метку на втором ViewController на раскадровке и создайте для нее выход с именем
someLabel
в соответствующий класс ViewController. - Добавьте следующую реализацию
awakeFromNib
ко второму ViewController:
.
- (void) awakeFromNib {
[super awakeFromNib];
if (self.someLabel == nil) {
NSLog(@"someLabel property is nil");
}
else {
NSLog(@"someLabel property is not nil");
}
if (_someLabel == nil) {
NSLog(@"_someLabel is nil");
}
else {
NSLog(@"_someLabel is not nil");
}
}
- Запустите приложение в симуляторе и нажмите кнопку.
Когда я это сделаю, я наблюдаю следующее:
2013-07-01 09:24:35.755 test[498:c07] someLabel property is nil
2013-07-01 09:24:35.758 test[498:c07] _someLabel is nil
Как следствие этого поведения, когда мне нужно, чтобы мои ViewControllers имели некоторую логику инициализации, которая включает их выходы, мне нужно использовать взломать, как тот, который предлагается в ответе здесь, чтобы иметь возможность использовать выходы. Если я правильно понимаю документацию, тот факт, что я вынужден использовать этот хак, является ошибкой в поведении UIKit, и я должен был бы поместить эту инициализацию в awakeFromNib
и просто использовать торговые точки без каких-либо хаков.
Я не могу найти никаких других упоминаний об этой проблеме в Интернете, хотя, что кажется странным, учитывая, что это принципиально важная часть функциональности, которая появляется (для меня). Я также никогда не использовал фактические файлы nib, только раскадровки, поэтому мне не хватает какой-то перспективы на этом, и документация по этому материалу достаточно сложная и достаточно сложная, что, будучи новичком в iOS, я не уверен, что понял правильно. Является ли это подлинной ошибкой UIKit или я неправильно понял документацию - возможно, этот метод даже не предназначен для использования в раскадровки?