2017-02-04 4 views
0

Я использовал этот код для настройки окна. Он работал раньше.Почему мое окно загружается каждый раз, когда я получаю доступ к `self.window`

- (void)awakeFromNib 
{ 
    NSLog(@"self = %p", self); 
    [(NSPanel *)self.window setWorksWhenModal: NO]; 
} 

Во всяком случае, каждый раз, когда я достигаю self.window окно загружается из кончика пера. Это проблема здесь, потому что она делает это рекурсивным. но это проблема и в других местах, так как каждый раз я получаю другое окно!

enter image description here

От "NSWindowController":

/* The window getter will load the nib file (if there is one and it has not yet been loaded) and then return the window. 
If it has to load the window, it will first call -windowWillLoad, then -loadWindow, then -windowDidLoad. 
To affect nib loading or do something before or after it happens, you should always override those other methods. 

     The window setter is used internally from -initWithWindow: or when a controller's nib file is loaded (as the "window" outlet gets connected). 
You can also call it yourself if you want to create the window for a window controller lazily, but you aren't loading it from a nib. 
This can also be used to set the window to nil for cases where your subclass might not want to keep the window it loaded from a nib, but rather only wants the contents of the window. 
Setting the window to nil, after the nib has been loaded, does not reset the -isWindowLoaded state. 
A window controller will only load its nib file once. This method makes sure the window does not release when closed, and it sets the controller's -windowFrameAutosaveName onto the window and updates the window's dirty state to match the controller's document (if any). 
It also calls -setWindowController: on the window. You can override this if you need to know when the window gets set, but call super. 
    */ 
    @property (nullable, strong) NSWindow *window; 

ответ

1

Какие объекты находятся в окне СИБ? Я подозреваю, что вы создали экземпляр класса вашего контроллера окон в NIB.

Так что всякий раз, когда вы загружаете этот NIB (возможно, через экземпляр класса вашего контроллера окон, который вы создаете в коде), создается новый экземпляр вашего оконного контроллера. Этот новый экземпляр получает -awakeFromNib и запрашивает его window, что заставляет его загружать другой экземпляр NIB и повторяет этот процесс.

Контроллер окна не должен создаваться в окне NIB. Заполнитель владельца файла в NIB должен быть настроен так, чтобы иметь класс оконного контроллера. Контроллер окна должен быть создан в коде и инициализирован таким образом, чтобы он использовал себя как владелец NIB. Это сделает его таким, чтобы он заполнил место, которое владелец файла удерживает для него.

Кроме того, вы, вероятно, должны избегать переопределений -awakeFromNib. Его можно назвать неожиданно. Как правило, более безопасно переопределять -windowDidLoad для таких задач.

+0

О, это было именно оно. У меня был объект контроллера в окне NIB! Спасибо! – netigger

+0

Или подожди, позволь мне проверить это снова .. Просто воссоздал его, а теперь нет объектов в NIB, но все равно получай его, я не могу вернуться. – netigger

+0

У меня на самом деле была проблема. Но я все еще обращался к 'self.window' из awakeFromNib, но, похоже, теперь работает хорошо, что я удалил это также – netigger

Смежные вопросы