0

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

按钮控制器.h

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

按钮控制器.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 中,我什至可以打开窗口的唯一方法是如果选中“启动时打开”-我不应该能够以编程方式打开它们吗?

4

2 回答 2

4

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

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

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

于 2013-10-06T22:00:07.153 回答
0

如果你使用NSWindowController它最好使用它的close方法:

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

要不就:

[answerWindowController close];

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

还要检查您的窗口是否未选中“启动时可见”(似乎没有)。

于 2013-10-06T19:18:53.580 回答