Подтвердить что ты не робот

Почему мой бодрствующий огонь?

Я начинаю переводить больше структуры иерархии представления в 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: обычным способом? Есть ли лучший способ сделать это?

4b9b3361

Ответ 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?