【问题标题】:One App Delegate, Two Windows一个应用程序代表,两个窗口
【发布时间】:2012-07-24 12:51:42
【问题描述】:

我有一个简单的 Cocoa 应用程序。它有两个窗口,每个窗口都在一个单独的 xib 文件中:

  • MainMenu.xib
  • SecondaryWindow.xib

我有一个 AppDelegate 类,它引用了 MainMenu.xib 中的窗口。我试图让它引用 SecondaryWindow.xib 中的窗口。我对如何做到这一点感到困惑。我做了一个出口,例如:

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSWindow *secondaryWindow;

@end

下面是实现:

@implementation AppDelegate

@synthesize window = _window;
@synthesize secondaryWindow = _secondaryWindow;


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [NSBundle loadNibNamed:@"SecondaryWindow" owner:self];
    NSLog(@"_window = %@", _window);
    NSLog(@"_secondaryWindow = %@", _secondaryWindow);
}

@end

_secondaryWindow 始终为 (null)

我在 SecondaryWindow.xib 中添加了一个出口,将第二个窗口连接到 AppDelegate 中的出口。我还需要在 SecondaryWindow.xib 中做什么才能完成连接?

编辑:添加 [NSBundle loadNibNamed...]

【问题讨论】:

    标签: objective-c macos cocoa interface-builder


    【解决方案1】:

    您需要加载它... 默认情况下,MainWindow.xib 由框架加载,它创建自己的应用程序委托实例。 您应该从您的应用程序委托加载您的第二个窗口(尝试[NSBundle laodNibNamed:@"SecondaryWindow" owner:self]。当您这样做时,文件的所有者将成为应用程序委托 - 在界面构建器中更改文件所有者的类以反映这一点并建立您的连接)

    【讨论】:

    • 谢谢马丁。我添加了 [NSBundle loadNibNamed..],因为它是我在文档中找到的最接近您的建议的。我已经修改了我的问题以表明这一点。但是,secondaryWindow 仍然为空......我在 loadNibNamed 中使用了错误的所有者吗?或者也许 applicationDidFinishLaunching 不是正确的方法?
    • 嗨 Martin,我仍然找不到 [[NSBundle mainBundle] loadNibNamed...] 可能是针对 iOS 而不是针对 OS X?
    • 我的意思是那些.. 把它弄混了^^:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
    【解决方案2】:

    您是否将辅助窗口的 .xib 中的 File's Owner 类型设置为您的应用程序委托的类型?然后您是否将那个 .xib 中的窗口连接到 File's Owner 的 secondaryWindow 出口?

    如果您执行了这些操作,并且 .xib 已正确包含在项目中,并且您已在 +loadNibNamed:owner: 消息中正确指定了文件名,则应填充您的 secondaryWindow 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多