awakeFromNib из nib1 вызывается при программной загрузке nib2 - PullRequest
0 голосов
/ 19 мая 2011

Когда я загрузил nib2 из nib1 с приведенным ниже синтаксисом, метод awakeFromNib из моего текущего nib (nib1) был вызван снова.(Но не метод initWithFrame) Даже если nib2 был открыт и правильно получил фокус.Я не хочу, чтобы awakeFromNib из nib1 снова выполнялся.Что мне не хватает?

[NSBundle loadNibNamed:@"iQueryWindow" owner:self];

Дополнительная информация: iQueryWindow.xib имеет связанный с ним подкласс iQueryView.h и iQueryView.m NSView, чтобы создать вид окна с кнопкой, текстовым полем и т. Д. ПоследовательностьСобытие выглядело так: я нажал кнопку в представлении nib1, его событие clicked имеет только одну строку кода, как указано выше, чтобы открыть окно nib2.Окно Nib2 открывается со всей инициализацией, включая собственные методы inintWithFrame и awakeFromNib (nib2).После этого я заметил, что окно nib1 изменилось из-за вызова собственного awakeFromNib (я также могу наблюдать это через консоль с помощью оператора NSlog).(Окно nib2 отображается поверх nib1.) На nib2 есть кнопка, которая закрывает nib2 следующим образом: [self.window close].

Ответы [ 2 ]

1 голос
/ 19 мая 2011

-awakeFromNib отправляется всем объектам в nib-файле, включая его владельца. Если у вас есть объект, загруженный из файла пера, и вы сделаете этот объект владельцем другого файла пера, он получит -awakeFromNib дважды. Это происходит по замыслу.

Хотя у вас может быть ивар для управления состоянием вашего класса в отношении пробуждения от пера, рассмотрите возможность использования подкласса NSViewController (или NSWindowController; на самом деле не ясно, есть ли у nib2 вид или окно как один из объектов верхнего уровня) как владелец файла вторичного файла пера.

0 голосов
/ 19 мая 2011

В соответствии с предложением Bavarious я использую NSWindowController вместо NSBundle для решения этой проблемы.Вот код:

NSWindowController *iQWController = [[NSWindowController alloc] initWithWindowNibName:@"iQueryWindow"];
[iQWController showWindow:sender];
...