如何在NSWindowController中使用关闭按钮停止模态?

时间:2012-12-04 03:28:19

标签: objective-c macos modal-dialog nswindowcontroller nspanel

当用户点击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 作为模态的结果。

但我认为还有另一种解决此问题的通用方法。

我想采取一种简单的方法。

3 个答案:

答案 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上测试