无法关闭窗户 - 为什么?

时间:2013-10-06 05:41:32

标签: objective-c macos cocoa nswindow

我有一个应用程序,当在单独的窗口中单击或关闭复选框时,应该打开和关闭窗口。我可以打开它,但不能关闭它。我在windowControllerObject中定义了一个NSWindow并尝试关闭NSWindow。相关代码是:

buttonController.h

@interface buttonController : NSWindowController
{
NSButton *showAnswerBox;
infoWindowController *answerWindowController;
}
- (IBAction)showAnswer:(id)sender;
@end

buttonController.m

- (IBAction) showAnswer:(id) sender
{
     if ([sender state] == NSOnState) {
         if (!answerWindowController) {
             answerWindowController = [[infoWindowController alloc] init];
             }
         [answerWindowController showWindow:self];
         }
     else {
        [answerWindowController hideWindow];
     }
}

infoWindowController.h:

@interface infoWindowController : NSWindowController {

IBOutlet NSWindow * infoWindow; 
}
- (id) init;
- (NSWindow *) window; 
- (void) hideWindow;
- (void) tsSetTitle: (NSString *) displayName;

@end

在infoWindowController.m中:

- (NSWindow *) window
{
     return infoWindow;
}

- (void) hideWindow
{
  [[self window] close];
}

窗口打开,但不会关闭。我尝试了几种变体,包括infoWindowController上的orderOut。我确定我错过了一些愚蠢的东西 - 它是什么?

在IB中,我甚至可以打开窗户的唯一方法是,如果“启动时打开”选中 - 我不应该以编程方式打开它吗?

2 个答案:

答案 0 :(得分:4)

NSWindowController已经定义了window属性。您已经通过实现自己的-window方法有效地覆盖了该属性的getter。但是,setter仍然是继承版本。

因此,假设您已将控制器的window插座连接到NIB中的窗口,则会调用继承的setter。这允许继承的-showWindow:实现来显示窗口。但是,-window方法将返回nil,因为继承的setter不会设置infoWindow实例变量。

摆脱单独的infoWindow财产和吸气剂。只需使用继承的window属性及其访问者。

答案 1 :(得分:0)

如果您使用NSWindowController,最好使用close方法:

- (void) hideWindow
{
  [self close];
}

或只是:

[answerWindowController close];

但您的代码也有效,只需确保您的[answerWindowController window]不是零。如果从xib加载窗口,则应使用此xib的名称初始化窗口控制器:answerWindowController = [[AnswerWindowControllerClass alloc] initWithWindowNibName:@"YOUR WINDOW XIB NAME"];

同时检查您的窗口是否取消选中“在启动时可见”(似乎没有)。