Cocoa - 将IBOutlet链接到单独的Nib文件

3

我有一个nib文件,在我的应用程序的某个点上加载。我是否可以将AppDelegate中的NSWindow IBOutlet链接到第二个nib文件的窗口?换句话说,我的IBOutlet没有连接到Xcode默认创建的MainMenu xib文件。如果这是合法的,我可以访问NSWindow的框架和其他功能吗?

3个回答

6

是的,你可以这样做。在你的第二个nib文件中,我建议使用NSWindowController作为文件的所有者。然后在你的AppDelegate中,创建一个NSWindowController实例,然后加载nib文件。从那里开始,你可以检查由NSWindowController拥有的窗口的属性,或者对窗口进行任何你想要的操作。

这里是一个例子:

@interface MyAppDelegate : NSObject 
{
    NSWindowController *myWindowController;
}

@end

@implementation MyAppDelegate

- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
{   
    myWindowController = [[NSWindowController alloc] initWithWindowNibName:@"MySecondWindow"];

    [[myWindowController window] center];
    [[myWindowController window] makeKeyAndOrderFront:self];
} 

@end

你能给我展示一个例子吗?所以我在文件的所有者中有NSWindowController。我使用[NSBundle loadNib:owner:]来加载nib。现在,我应该只是使用Controller *class = [[Controller alloc] init];,然后像这样访问我的属性吗? - lab12
我在“Controller”类的头文件中有一个-(void)show;方法,在该方法中有[main makeKeyAndOrderFront:nil];以显示其他nib文件的窗口。我不确定为什么它没有显示。 - lab12
我刚刚用一个例子修改了我的答案。 - David
哦,我懂了!谢谢,让我试试这个并确认它能正常工作。 - lab12
如果 nib 窗口的“Visible at Launch”未选中,为什么窗口不会加载? - lab12
如果你发送 makeKeyAndOrderFront,则该窗口应该启动。 - David

1
在你的第二个 nib 文件中,将文件的所有者设置为你的应用程序委托类。然后在 IB 中根据需要附加出口。在运行时,调用 [NSBundle loadNibNamed:owner:] 并确保将 self 作为所有者传递。

0

是的,只要应用程序委托是您加载的nib文件的文件所有者,这就是合法的。话虽如此,如果您稍后卸载nib,则必须确保nib中的所有顶级对象都已正确释放(否则会创建内存泄漏)。


如果App Delegate不是nib文件的File's Owner,我还能做到吗?还是有其他替代方案? - lab12
如果 App Delegate 不是所有者,那么 IBOutlet 必须在 Nib 的所有者对象中声明。 - indragie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接