1

我不明白这里发生了什么。我有一个按钮连接到 AppDelegate 中的以下操作:

- (IBAction)openWindow:(id)sender {
    self.winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"];
}

单击按钮时没有任何反应(如预期的那样),但是当我将代码更改为(添加NSLog()

- (IBAction)openWindow:(id)sender {
    self.winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"];
    NSLog(@"%@",self.winCon.window);
}

弹出“NewWindow”窗口。为什么会这样?NSLog 也会(null)在控制台中打印。

(在“NewWindow”xib 中,文件的所有者是 NSObject,我没有连接窗口引用。所以我期待打印日志null,但显示的窗口令人惊讶)

另一件事,当我使用时:

- (IBAction)openWindow:(id)sender {
    [NSBundle loadNibNamed:@"NewWindow" owner:self.winCon];
}

单击按钮时,将显示窗口。为什么会这样?不加载笔尖并显示窗口分隔的进程。我不应该调用showWindow:ormakeKeyAndOrderFront:来显示窗口吗?

当我在窗口编程指南中阅读特定的苹果文档时:

打开一个窗口——也就是说,使一个窗口可见——通常是通过调用 NSWindow 中的 makeKeyAndOrderFront:、orderFront: 等方法之一将窗口放入应用程序的窗口列表中来完成的。此外,在 Interface Builder 中设置了某些位,在某些情况下加载 nib 文件时会显示该窗口。

我想这就是loadNibNamed:..打开窗户的原因。但是这些“在 Interface Builder 中设置的位”是什么。我在哪里可以获得这方面的信息?(当我取消选中窗口的“启动时可见”属性时,我也可以在上述情况下阻止窗口打开- 如果对这个属性的作用有更多解释会有所帮助。)谢谢。

注意:我知道如何使用 NSWindowController 子类初始化 nib 并在 xib 中进行正确的接线,但我只是对上述行为感到好奇。

4

1 回答 1

0

要回答您的第一个问题,您NSLog(@"%@",self.winCon.window);实际上是在向窗口控制器实例发送一条消息以winCon显示其窗口,然后向它发送一条附加description消息以输出将在控制台中显示的字符串。用正常的消息传递语法(不是点表示法)编写并在格式字符串中使用“%s”,您正在这样做:NSLog(@"%s",[[[self winCon] window] description]. 根据文档,window 方法将返回窗口实例尝试加载尚未显示的窗口。

loadNibNamed:owner:NSBundle 方法只应在您不使用窗口控制器时使用。加载 nib 文件和显示窗口是两个独立的操作。如果您还没有这样做,您应该阅读文件所有者占位符以及如何将 xib 文件归档到 nib 文件中。话虽如此,您的 showWindow 方法应该如下所示(尽管您确实应该将 NSWindowController 子类化并且已经对其进行了初始化 - 如果这没有意义,请告诉我):

- (IBAction)openWindow:(id)sender {
    self.winCon = [[NSWindowController alloc] initWithWindowNibName:@"NewWindow"];
    [self.winCon showWindow];
}
于 2013-06-22T21:10:08.997 回答