一个应用程序代表,两个窗口

Posted

技术标签:

【中文标题】一个应用程序代表,两个窗口【英文标题】: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...]

【问题讨论】:

【参考方案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 属性。

【讨论】:

以上是关于一个应用程序代表,两个窗口的主要内容,如果未能解决你的问题,请参考以下文章

一个程序里两个窗口之间切换的快捷键是啥

MFC怎么知道哪个窗口对应的哪个类

Tkinter类之窗口部件类

如何使用 MFC 分别创建两个窗口?

如何在两个窗口之间维护 Wpf 应用程序中的会话? [关闭]

如何同时滚动三个 ScrollView?