当用户点击NSWindowController中的红色关闭按钮时,我想停止模态。
在NSWindowController中,有“OK”和“Cancel”按钮。
- (IBAction)okButtonClicked:(id)sender
{
[NSApp stopModalWithCode:NSOKButton];
[self.window close];
}
- (IBAction)cancelButtonClicked:(id)sender
{
[NSApp stopModalWithCode:NSCancelButton];
[self.window close];
}
当我点击红色关闭按钮时,窗口将关闭,模态不会停止。 我找到了 windowWillClose:函数。
- (void)windowWillClose:(NSNotification *)notification
{
if ([NSApp modalWindow] == self.window)
[NSApp stopModal];
}
然而,
if ([NSApp runModalForWindow:myWindowController.window] != NSOKButton)
return;
即使单击“确定”按钮,也会调用 windowWillClose:函数, runModalForWindow:函数将始终返回NSCancelButton。
我可以将成员变量添加到 myWindowController 作为模态的结果。
但我认为还有另一种解决此问题的通用方法。
我想采取一种简单的方法。
答案 0 :(得分:4)
也许有点晚了,但我发现这个问题试图为自己找到答案。这就是官方文档中的内容:当你关闭窗口[窗口关闭]时,没有调用- (BOOL)windowShouldClose:(id)sender
事件处理程序。仅在使用红色关闭按钮或[window performClose:]选择器时调用它。所以解决方案是在NSWindowController子类中实现windowShouldClose:
而不是windowWillClose:
。
答案 1 :(得分:3)
您可以尝试这样
- (IBAction)okButtonClicked:(id)sender
{
[NSApp stopModalWithCode:NSOKButton];
[NSApp endSheet:self.window];
}
- (IBAction)cancelButtonClicked:(id)sender
{
[NSApp stopModalWithCode:NSCancelButton];
[NSApp endSheet:self.window];
}
答案 2 :(得分:1)
根据 NSapplication Class Reference 关于NSApplication的endSheet:方法将在10.10(Mavericks)中弃用。 Apple建议使用NSWindow beginSheet:和endSheet:方法,因此,如果您试图从NSWindowController子类中解除NSWindowController,则应使用此代码段
[self.window.sheetParent endSheet:self.window];
它使用NSWindow的 sheetParent 属性来调用 endSheet: 并传递您的子类&#39 ;窗口作为参数。你也可以使用NSWindow的endSheet:returnCode:如果你想指定返回码。在OSX 10.9 / XCode 6.1.1上测试