Почему мне нужно дважды вызывать showWindow на моем NSWindowController в 10.5?

У меня есть подкласс NSWindowController, который я использую для загрузки окна из пера и отображения его на экране. Ниже приведен код, который вызывается, когда я хочу показать окно. В 10.6, когда вызывается showCustomWindow, отображается окно, но в 10.5 этот метод нужно вызывать дважды, чтобы окно отобразилось.

-(IBAction)showCustomWindow:(id)sender 
{
   if(!windowController){
       windowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindow"];
    }

    [windowController showWindow:self];
}

В окне установлен флажок «Видно при запуске», и снятие этого флажка, похоже, не имело значения.

Изменить: я понял, что проблема, с которой я столкнулся, не связана с моим NSWindowController или showWindow. Я все это настроил правильно. Однако я обнаружил, что не все классы реализуют awakeFromNib. В одном из моих подклассов NSView (который был в пере, которое я пытался загрузить) я вызывал [super awakeFromNib], который давал мне «не отвечает на селектор» (но только на 10.5, что странно). Итак, я мог бы просто убрать [super awakeFromNib], но я выбрал, надеюсь, более надежный:

if([NSView instancesRespondToSelector:@selector(awakeFromNib)]) {
    [super awakeFromNib];
}

Это позволило моему перу нормально загружаться и правильно работать showWindow.


person Austin    schedule 07.10.2009    source источник
comment
Документация гласит следующее: Вы должны вызывать суперреализацию awakeFromNib только в том случае, если вы точно знаете, что ваш суперкласс предоставляет реализацию. Поскольку Application Kit не предоставляет реализацию по умолчанию для метода awakeFromNib, вызов super приводит к исключению, если родительский класс не реализует его. Классы, непосредственным родительским классом которых является NSObject или NSView, не нуждаются в вызове супер-реализации. Другими словами, не стоит называть его super, если это просто подкласс NSView.   -  person    schedule 29.12.2009


Ответы (3)


Если вы хотите использовать -showWindow: для управления временем видимости этого окна, следует снять флажок «Видимо при запуске».

Все остальное кажется правильным из того, что вы нам показали, так что это всего лишь предположение, но вы забыли подключить выход window на вашем объекте File's Owner к окну вашего пера?

person Ashley Clark    schedule 07.10.2009

Вы вызываете -showWindow до того, как окно завершит загрузку из пера? Вы можете установить точку останова в [MyWindowController awakeFromNib], чтобы узнать.

person Darren    schedule 07.10.2009

Изменить: ОК, извините, я неправильно понял ваш вопрос и вижу, что вам нужно дважды вызвать showWindow. У меня нет на это ответа.

Вы видите правильное поведение, поскольку метод initWithWindowNibName: фактически не загружает перо. Загрузка пера происходит лениво ... поэтому после вызова метода showWindow или другого метода, такого как window, который требует загрузки пера.

person Ira Cooke    schedule 07.10.2009