当编程加载nib2时,来自nib1的awakeFromNib被调用

时间:2011-05-18 20:32:54

标签: objective-c cocoa xib nib

当我使用下面的语法从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]。

2 个答案:

答案 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];