2009-10-07 6 views
3

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

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

    [windowController showWindow:self]; 
} 

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

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

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

Это позволило моему перу, чтобы загрузить нормально и ShowWindow, чтобы работать должным образом.

+3

Документы читаются следующим образом: «Вы должны назвать супер-реализацию awakeFromNib только в том случае, если вы точно знаете, что ваш суперкласс обеспечивает реализацию. Поскольку Application Kit не предоставляет стандартную реализацию метода awakeFromNib, вызывая супер-результаты в исключение, если родительский класс не реализует его. Классы, чей непосредственный родительский класс NSObject или NSView не требуют вызова супер-реализации ». Другими словами, не надо называть его супер, если это просто подкласс NSView. – 2009-12-28 22:32:41

ответ

0

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

0

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

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

4

Видимый на Launch должен быть снят, если вы хотите использовать -showWindow: для контроля времени видимости этого окна.

Все остальное кажется прямо от того, что вы показали нам, так что это только предположение, но вы забыли подключить window выход на объект владельца вашего файла в окно в вашем СИБ?