Cocoa - 将 IBOutlet 链接到单独的 Nib

Posted

技术标签:

【中文标题】Cocoa - 将 IBOutlet 链接到单独的 Nib【英文标题】:Cocoa - Link IBOutlet to Separate Nib 【发布时间】:2011-02-17 15:17:15 【问题描述】:

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

【问题讨论】:

【参考方案1】:

是的,您可以这样做。在您的第二个 nib 文件中,我将使用 NSWindowController 作为 nib 的文件所有者。然后在您的 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:] 加载笔尖。现在我应该只使用 Controller *class= [[Controller alloc] init];,然后像这样访问我的属性吗? 所以我有一个 -(void)show;我在“Controller”类的头文件中的方法,并且在该方法中它具有 [main makeKeyAndOrderFront:nil];显示另一个 nib 文件的窗口。我不知道为什么它没有显示。 我刚刚用一个例子修改了我的答案。 哦,我明白了!谢谢,让我试试这个并确认它有效。 如果 nib 窗口的 Visible at Launch 未选中,为什么窗口不加载?【参考方案2】:

在您的第二个 nib 中,将 File's Owner 设置为您的应用委托类。然后根据需要在 IB 中连接插座。在运行时,调用 [NSBundle loadNibNamed:owner:] 并确保将 self 作为所有者传递。

【讨论】:

【参考方案3】:

是的,只要 App Delegate 是您正在加载的 nib 的文件所有者,这就是合法的。也就是说,如果稍后卸载 nib,则必须确保 nib 中的所有***对象都已正确释放(否则会造成内存泄漏)。

【讨论】:

如果 App Delegate 不是 nib 的文件所有者怎么办?我还能做到吗,还是有其他选择? 如果 App Delegate 不是所有者,则必须在任何对象中声明 IBOutlet 是 nib 的所有者。

以上是关于Cocoa - 将 IBOutlet 链接到单独的 Nib的主要内容,如果未能解决你的问题,请参考以下文章

无法将连接器从 IBOutlet 链接到视图控制器

在扩展中定义 IBOutlet 属性

将 Cocoa Touch 框架链接到 Today Extension 时出现链接器错误

为啥插入动作出现而不是 iBoutlet?

Cocoa:将子视图添加到来自不同类和 nib 的视图

ScrollView 中的 IBOutlet 产生 nil