我有一个应用程序,当在单独的窗口中单击或关闭复选框时,应该打开和关闭窗口。我可以打开它,但不能关闭它。我在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中,我甚至可以打开窗户的唯一方法是,如果“启动时打开”选中 - 我不应该以编程方式打开它吗?
答案 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"];
。
同时检查您的窗口是否取消选中“在启动时可见”(似乎没有)。