Почему мой бодрствующий огонь?
Я начинаю переводить больше структуры иерархии представления в IB.
У меня есть файл nib под названием "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;
}
Может кто-нибудь уточнить для меня, что я пропустил здесь?
Cheers,
Дуг
UPDATE:
После прочтения некоторых ответов, которые я понимаю, мне нужно разобраться в том, что является довольно фундаментальным.
Глядя на инициализацию:
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
Я замечаю, что я вызываю initWithNibName: bundle: косвенно. Это плохая практика? Файл AlignmentViewController.xib определяет мою иерархию представлений. Но я не использую initWithNibName: bundle: обычным способом? Есть ли лучший способ сделать это?
Ответы
Ответ 1
-awakeFromNib
отправляется ко всему объекту, который создается из nib после создания всех объектов nib. Владелец не является одним из этих объектов. Он существует до десериализации ниба и подключается к наконечнику после загрузки, поэтому он не отправляется -awakeFromNib
(если, конечно, он не создается каким-то другим нитьем).
Один из ключевых моментов заключается в том, что оба способа не могут быть вызваны как -initFromChromosomePair:basepairStart:basepairEnd:
, так и -awakeFromNib
. Погрузчик nib всегда вызывает -initWithCoder:
, -initWithFrame:
или -init
(правила, для которых отправлено, находятся в Жизненный цикл объекта Nib), Тот факт, что у вас есть другой назначенный инициализатор, настоятельно указывает на то, что вы вручную создаете этот объект где-то в коде, что означает, что этот объект не "пробуждается от nib".
Ответ 2
Просто добавив разъяснение: -awakeFromNib отправляется владельцу файла в Cocoa, но не Cocoa Touch.
Из Apple Docs:
...
- Он отправляет сообщение awakeFromNib соответствующим объектам в файле nib, которые определяют селектор соответствия:
- В Mac OS X это сообщение отправляется на любые объекты интерфейса, которые определяют метод. Он также отправляется владельцу файлов и любым прокси-объектам, которые также определяют его.
- В iPhone OS это сообщение отправляется только объектам интерфейса, которые были созданы при помощи кода загрузки nib. Он не отправляется владельцу файлов, первому ответчику или другим прокси-объектам.
Ответ 3
Основываясь на том, что вы нам сказали, я считаю, что знаю, в чем проблема. awakeFromNib
вызывается, когда объект десериализуется из файла nib. Здесь у вас есть объект, который является владельцем, который существует до, где загружается nib. Таким образом, awakeFromNib
никогда не будет отправлено на ваш AlignmentViewController.h
.
Если вам нужно что-то сделать, попробуйте вместо этого использовать loadView
. Или просто сделайте это после загрузки ножа. Что вы связываете с тем, что хотите сделать в awakeFromNib
?