NSWindowController — получать уведомления перед отображением окна?

У меня есть окно, содержащееся в файле пера, который загружается пользовательским подклассом NSWindowController следующим образом:

- (id)init
{
    self = [super initWithWindowNibName:@"MyWindow"];

    return self;
}

Я хотел бы инициализировать представления в этом окне, прежде чем оно станет видимым. Прямо сейчас я читаю некоторые пользовательские настройки по умолчанию и устанавливаю представления окна в windowDidLoad. Но, к сожалению, новые инициализированные значения применяются только после того, как окно становится видимым, в результате чего неинициализированные значения мигают очень быстро.

windowWillLoad не работает, так как на тот момент окно еще не было загружено из файла пера.

Как я могу инициализировать окно перед его отображением?


person tajmahal    schedule 17.06.2012    source источник


Ответы (2)


- (void)awakeFromNib — очень хорошее место для настройки представления. Вызывается после разархивирования всех объектов и подключения розеток.

Дополнительная информация в документации< /а>

person cdelacroix    schedule 17.06.2012
comment
Обычно я использую этот метод для такой настройки, но я подумал, что в данном случае он не сработает, так как я не создавал экземпляр этого оконного контроллера в файле пера, а скорее в коде, в вызываемом методе действия при нажатии на определенный пункт меню. Однако я только что попробовал, и это работает, хотя оконный контроллер не разархивируется из файла пера, а создается программно. Почему это работает? - person tajmahal; 17.06.2012
comment
Поскольку вы вызываете initWithWindowNibName:, self становится владельцем пера, а awakeFromNib вызывается при загрузке. Остерегайтесь побочного эффекта: загрузка пера, вероятно, будет отложена до тех пор, пока не будет показано окно. Чтобы действительно знать, кто вызывает метод, поставьте точку останова в awakeFromNib и посмотрите на обратную трассировку. - person cdelacroix; 18.06.2012
comment
Ах я вижу. Я согласен с отложенной загрузкой — в конце концов, я использую awakeFromNib только для инициализации пользовательского интерфейса самого окна, содержащегося в этом наконечнике. - person tajmahal; 18.06.2012
comment
Взгляд в отладчике, как вы предложили, показывает, что перо действительно загружается только после того, как я вызываю метод showWindow: оконного контроллера, после чего вызывается awakeFromNib. - person tajmahal; 18.06.2012
comment
Кстати, должен ли я вызывать [super awakeFromNib] в методе awakeFromNib оконного контроллера? Должен ли я передавать self или nil в showWindow: в качестве отправителя при вызове его непосредственно в коде (т.е. не как действие элемента управления)? - person tajmahal; 18.06.2012
comment
В большинстве случаев вам не нужно вызывать [super awakeFromNib] (см. документацию об этом). Я обычно передаю nil в качестве аргумента для showWindow: при программном вызове. - person cdelacroix; 18.06.2012

Вы можете сделать свой собственный "showWindow".

- (IBAction)showWindow:(id)sender
{
    // do whatever initialization 
    // or window UI setup you 
    // need to do right here
    [super showWindow: sender];
}
person Michael Dautermann    schedule 17.06.2012