Почему не проснулся мой огонь из ниба?

Я начинаю перемещать больше своей конструкции иерархии представлений в 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.

Из документов Apple:

...

  • Он отправляет сообщение awakeFromNib соответствующим объектам в файле пера, которые определяют соответствующий селектор:
    • В Mac OS X это сообщение отправляется любым интерфейсным объектам, которые определяют метод. Он также отправляется владельцу файла и любым прокси-объектам, которые его также определяют.
    • В iPhone OS это сообщение отправляется только объектам интерфейса, для которых был создан код загрузки пера. Он не отправляется владельцу файла, первому ответчику или другим прокси-объектам.

Судя по тому, что вы нам сказали, я знаю, в чем ваша проблема. awakeFromNib вызывается, когда объект десериализуется из файла пера. Здесь у вас есть объект, являющийся владельцем, который существует до загрузки пера. таким образом awakeFromNib никогда не будет отправлен на ваш AlignmentViewController.h,

Если вам нужно что-то сделать здесь, попробуйте использовать loadView вместо. Или просто сделайте это после загрузки пера. Что вы пытаетесь сделать, что вы хотели сделать это в awakeFromNib?

Вы должны переопределить функцию awakeFromNib(). Не переопределять функцию класса awakeFromNib()

      override func awakeFromNib() {
    super.awakeFromNib()
    setupContent()
}
Другие вопросы по тегам