无法关闭窗口 - 为啥?
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"];
。
还要检查您的窗口是否未选中“启动时可见”(似乎没有)。
【讨论】:
以上是关于无法关闭窗口 - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章