当我使用下面的语法从nib1加载nib2时,我的当前nib(nib1)中的awakeFromNib方法再次被调用。 (但不是initWithFrame方法)即使打开nib2并正确获得焦点。我不希望再次执行nib1中的awakeFromNib。我错过了什么?
[NSBundle loadNibNamed:@"iQueryWindow" owner:self];
更多信息:iQueryWindow.xib有一个与它关联的NSView的iQueryView.h和iQueryView.m子类,用按钮,文本字段等创建窗口视图。事件的顺序如下:我点击了nib1中的一个按钮在view中,它的clicked事件只有一行代码,如上所示打开nib2的窗口。 Nib2的窗口打开了所有初始化,包括其(nib2)拥有的inintWithFrame和awakeFromNib方法。之后我可以观察到nib1的窗口因为自己的awakeFromNib被调用而改变了(我也可以在NSlog语句的帮助下通过控制台观察到这一点)。 (nib2的窗口显示在nib1的顶部。)nib2上有一个按钮,它将关闭nib2:[self.window close]。
答案 0 :(得分:1)
-awakeFromNib
将发送到nib文件中的所有对象,包括文件的所有者。如果您有一个从nib文件加载的对象并使该对象成为另一个nib文件的所有者,它将会收到-awakeFromNib
两次。这是通过设计实现的。
虽然您可以使用ivar来管理类的状态,但是请考虑使用NSViewController
(或NSWindowController
的子类;但是nib2是否具有视图或窗口作为其顶级对象之一)作为辅助nib文件的文件所有者。
答案 1 :(得分:0)
Per Bavarious的建议,我使用NSWindowController而不是NSBundle来解决这个问题。这是代码:
NSWindowController *iQWController = [[NSWindowController alloc] initWithWindowNibName:@"iQueryWindow"];
[iQWController showWindow:sender];