Почему не проснулся мой огонь из ниба?
Я начинаю перемещать больше своей конструкции иерархии представлений в IB.
У меня есть файл пера с именем "AlignmentViewController.xib", в котором я настроил иерархию представления с AlignmentViewController в качестве владельца файла. Это отлично работает.
Один из методов, на которых я остаюсь неясным, - это awakeFromNib. В следующем фрагменте кода AlignmentViewController я добавляю еще один дополнительный метод awakeFromNib. Тем не менее, он не вызывается:
- (void)awakeFromNib {
NSLog(@"AlignmentViewController - awakeFromNib");
[super awakeFromNib];
}
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
if (nil != self) {
self.title = @"Alignment";
self.chromosomeName = chromosomeName;
self.basepairStart = basepairStart;
self.basepairEnd = basepairEnd;
self.wantsFullScreenLayout = YES;
}
return self;
}
Может кто-нибудь объяснить мне, что я здесь упустил?
Ура, Дуг
ОБНОВЛЕНИЕ: Прочитав некоторые ответы, я понимаю, что мне нужно докопаться до чего-то довольно фундаментального.
Глядя на инициализацию:
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
Я заметил, что я вызываю initWithNibName: bundle: косвенно. Это плохая практика? Файл AlignmentViewController.xib определяет мою иерархию представлений. Но я не использую initWithNibName: bundle: обычным способом? Есть лучший способ сделать это?
4 ответа
-awakeFromNib
отправляется всем объектам, которые создаются из пера после того, как были созданы все объекты пера. Владелец не является одним из таких объектов. Он существует до десериализации пера и после загрузки подключается к пиру, поэтому не отправляется -awakeFromNib
(если, конечно, он не создан каким-то другим пером).
Одна подсказка здесь - это то, что -initFromChromosomePair:basepairStart:basepairEnd:
а также -awakeFromNib
оба могут быть названы. Загрузчик пера всегда вызывает -initWithCoder:
, -initWithFrame:
или же -init
(правила для которых находятся в жизненном цикле объекта Nib). Тот факт, что у вас есть какой-то другой назначенный инициализатор, настоятельно предполагает, что вы вручную создаете этот объект где-то в коде, что означает, что этот объект не "пробуждается от пера".
Просто добавив уточнение: -awakeFromNib отправляется Владельцу файла в Какао, но не Cocoa Touch.
...
- Он отправляет сообщение awakeFromNib соответствующим объектам в файле пера, которые определяют соответствующий селектор:
- В Mac OS X это сообщение отправляется любым интерфейсным объектам, которые определяют метод. Он также отправляется владельцу файла и любым прокси-объектам, которые его также определяют.
- В iPhone OS это сообщение отправляется только объектам интерфейса, для которых был создан код загрузки пера. Он не отправляется владельцу файла, первому ответчику или другим прокси-объектам.
Судя по тому, что вы нам сказали, я знаю, в чем ваша проблема. awakeFromNib
вызывается, когда объект десериализуется из файла пера. Здесь у вас есть объект, являющийся владельцем, который существует до загрузки пера. таким образом awakeFromNib
никогда не будет отправлен на ваш AlignmentViewController.h
,
Если вам нужно что-то сделать здесь, попробуйте использовать loadView
вместо. Или просто сделайте это после загрузки пера. Что вы пытаетесь сделать, что вы хотели сделать это в awakeFromNib
?
Вы должны переопределить функцию awakeFromNib(). Не переопределять функцию класса awakeFromNib()
override func awakeFromNib() {
super.awakeFromNib()
setupContent()
}