awakeFromNib, выпуски и раскадровки: документация неправильная?
СогласноСправочник по дополнениям NSObject UIKit, выходные переменные должны быть установлены ко времениawakeFromNib
называется (выделено все мое):
Инфраструктура загрузки пера отправляет сообщение awakeFromNib каждому объекту, воссозданному из архива пера, но только после загрузки и инициализации всех объектов в архиве.Когда объект получает сообщение awakeFromNib, он гарантирует, что все его соединения с выходом и действием уже установлены.
...
Важное замечание: Поскольку порядок создания объектов из архива не гарантирован, ваши методы инициализации не должны отправлять сообщения другим объектам в иерархии.Сообщения другим объектам можно безопасно отправлять из метода awakeFromNib.
Как правило, вы реализуете awakeFromNib для объектов, которые требуют дополнительной настройки, которую нельзя выполнить во время разработки. Например, вы можете использовать этот метод для настройки конфигурации по умолчанию любых элементов управления в соответствии с предпочтениями пользователя или значениями в других элементах управления. Вы также можете использовать его для восстановления отдельных элементов управления до некоторого предыдущего состояния вашего приложения.
Однако это не соответствует моим тестам, по крайней мере, с использованием раскадровок. Результаты следующего теста противоречат документации:
Создайте новое приложение Single View в XCode.Перетащите второй ViewController на раскадровку.Дайте первому ViewController кнопку и создайте модальный переход из этой кнопки, который отображает второй 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
и просто использовать розетки без каких-либо взломов.
Я могу'Тем не менее, я не могу найти никакого другого упоминания об этой проблеме в Интернете, что кажется странным, учитывая, какой фундаментально важной частью функциональности это представляется (для меня). Я'Я также никогда не использовал настоящие файлы пера, только раскадровки, так что яМне не хватает некоторого взгляда на это, и документация по этому материалу многословна и достаточно сложна, чтобы как новичок в iOS яЯ не уверен, что яЯ правильно понял. Это подлинная ошибка UIKit, или я неправильно понял документацию - возможно, этот метод неt даже предназначено для использования в сочетании с раскадровками?