一个应用程序代表,两个窗口
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
属性。
【讨论】:
以上是关于一个应用程序代表,两个窗口的主要内容,如果未能解决你的问题,请参考以下文章