奇怪的NSLog行为:NSLog显示窗口控制器的窗口

时间:2013-06-21 13:40:40

标签: objective-c macos cocoa nslog nswindowcontroller

我不明白这里发生了什么。我在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,但显示的窗口是一个惊喜)< / p>

另一件事,当我使用时:

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

单击按钮,将显示窗口。为什么会这样? 不加载nib并显示窗口分隔的进程。我不应该拨打showWindow:makeKeyAndOrderFront:来显示该窗口吗?

当我在window programming guide中阅读特定的苹果文档时:

  

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

我想这是loadNibNamed:..打开窗口的原因。但这些'在Interface Builder中设置的位是什么'。我在哪里可以获得相关信息? (另外,当我取消选中'在窗口的启动时可见'属性时,我可以阻止窗口打开 - 如果对该属性的更多解释会有所帮助。)谢谢。< / p>

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

1 个答案:

答案 0 :(得分:0)

要回答您的第一个问题,当您编写NSLog(@"%@",self.winCon.window);时,您实际上是向窗口控制器实例winCon发送消息以显示其窗口,然后向其发送另外的description消息输出将在控制台中显示的字符串。使用正常的消息传递语法(非点符号)并在格式字符串中使用“%s”编写,您执行此操作:NSLog(@"%s",[[[self winCon] window] description]。根据{{​​3}},窗口方法将返回窗口实例尝试加载窗口(如果尚未显示)。

只有在不使用窗口控制器时才应使用loadNibNamed:owner: NSBundle方法。加载nib文件并显示窗口是两个单独的操作。如果您还没有这样做,则应该阅读文件所有者占位符以及如何将xib文件存档到nib文件中。话虽这么说,你的showWindow方法应该如下所示(虽然你真的应该继承NSWindowController并已经初始化了 - 让我知道这是否有意义):

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