4

当用户单击 NSWindowController 中的红色关闭按钮时,我想停止模式。

在 NSWindowController 中,有“确定”和“取消”按钮。

- (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;

即使我单击 OK 按钮,windowWillClose:函数也会被调用并且runModalForWindow:函数总是返回 NSCancelButton。

作为模态的结果,我可以将成员变量添加到myWindowController中。

但我认为会有另一种通用的方法来解决这个问题。

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

4

3 回答 3

4

也许有点晚了,但我只是发现了这个问题,试图为自己找到答案。这就是官方文档中所说的:- (BOOL)windowShouldClose:(id)sender当您通过 [window close] 关闭窗口时,不会调用事件处理程序。它仅在您使用红色关闭按钮或 [window performClose:] 选择器时调用。所以解决方案是在你的 NSWindowController 子类中实现windowShouldClose:而不是实现。windowWillClose:

于 2014-03-05T02:25:36.170 回答
3

你可以这样尝试

- (IBAction)okButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSOKButton];
    [NSApp endSheet:self.window];
}

- (IBAction)cancelButtonClicked:(id)sender
{
    [NSApp stopModalWithCode:NSCancelButton];
    [NSApp endSheet:self.window];
}
于 2012-12-04T04:25:00.633 回答
2

根据 NSapplication Class Reference ,endSheet: NSApplication 上的方法将在 10.10(Mavericks)中被弃用。Apple 建议使用 NSWindow beginSheet: 和 endSheet: 方法,因此如果您尝试从 NSWindowController 子类中关闭 NSWindowController ,则应使用此代码片段

[self.window.sheetParent endSheet:self.window];

它使用 NSWindow 的sheetParent属性调用endSheet:并将您的子类的窗口作为参数传递。你也可以使用 NSWindow 的 endSheet: returnCode: 如果你想指定返回码。在 OSX 10.9 / XCode 6.1.1 上测试

于 2015-02-05T20:26:17.790 回答