无法关闭窗口 - 为啥?

Posted

技术标签:

【中文标题】无法关闭窗口 - 为啥?【英文标题】:Can't close a window- why?无法关闭窗口 - 为什么? 【发布时间】:2013-10-06 05:41:31 【问题描述】:

我有一个应用程序,当在单独的窗口中单击或关闭复选框时,应该打开和关闭一个窗口。我可以打开它,但不能关闭它。我在 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 中,我什至可以打开窗口的唯一方法是如果选中“启动时打开”,我是否应该能够以编程方式打开它们?

【问题讨论】:

做过调试吗?方法叫什么?变量有效吗? 您是否有意用自己的实现覆盖窗口属性? hideWindow 方法中的 [infoWindow close] 会发生什么 已修改您的代码。请验证 Wain:是的,我添加了 NSLog 消息来验证调用了哪些方法。为了简洁起见,我删除了它们。 沃伦:不,我没有。我会检查的。 【参考方案1】:

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

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

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

【讨论】:

Ken:我已经删除了那些东西,但它仍然无法正常工作。问题可能出在此注释中:“因此,假设您已将控制器的窗口插座连接到 NIB 中的窗口”。我没有那样做。我需要在 infoWindowController 界面中做一个窗口插座吗? IBOutlet window是如何实现的? 肯,我终于想通了。我向文件所有者添加了一个出口window,键入NSWindow,然后控制将其拖到感兴趣的窗口中。谢谢你和大家。 通常,您将文件所有者的类设置为NSWindowController 的自定义子类。然后,IB 知道继承的window 插座,您可以连接它。直接告诉 IB 文件的所有者有一个window 出口也可以,但无论如何你可能希望它知道你的控制器的类。这样,当您添加更多属性或操作方法时,它们将自动可用。我推荐这个blog article。【参考方案2】:

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

- (void) hideWindow

  [self close];

或者只是:

[answerWindowController close];

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

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

【讨论】:

以上是关于无法关闭窗口 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:为啥新窗口在打开后立即关闭[重复]

为啥我的js关闭窗口没执行呢

为啥我的 Fancybox 窗口会立即打开和关闭?

为啥我正在用的窗口或者打开的页面会自动关闭?

Kendo UI - 为啥我不能正确打开和关闭窗口?

qt中将窗口关闭后为啥还会显示到历史窗口