在Swift中处理窗口的关闭事件

16
如何使用Swift处理窗口的关闭事件,例如,询问“您确定要关闭表格吗?”?

enter image description here

如果回答“是”,则表格将被关闭,如果回答“否”,表格将不会关闭。对于我来说,显示消息框不是问题。

viewWillDisappear()也适用于最小化,但我只需要关闭事件。

谢谢。

4个回答

19

就像上面所说的,你应该将ViewController设置为NSWindowDelegate,但是你应该处理windowWillClose而不是windowShouldClosewindowShouldClose用于确定窗口是否能够关闭,而不是窗口实际关闭时发生的事件。

我还发现你需要在viewDidAppear中设置delegate,而不是在viewDidLoad中。因为在viewDidLoad中,self.view.window还未定义。

override func viewDidAppear() {
    self.view.window?.delegate = self
}

self.view.window?.delegate = self 这段代码的作用是什么? - Nabeel Khan
2
将ViewController设置为代表它所表示的Window的委托。这允许符合NSWindowDelegate协议的ViewController实际上作为委托来发挥作用。 - Thomas Alvarez

11

我也有同样的疑问,但在这里详细解释的方法中解决了它:Quit Cocoa App when Window Close using XCode Swift 3

需要三个步骤:

  1. 在你的ViewController类中遵循NSWindowDelegate协议。
  2. 覆盖viewDidAppear方法。
  3. 添加windowShouldClose方法。

添加的代码应该像这样:

class ViewController: NSViewController, NSWindowDelegate {
    // ... rest of the code goes here
    override func viewDidAppear() {
        self.view.window?.delegate = self
    }
    func windowShouldClose(_ sender: Any) {
        NSApplication.shared().terminate(self)
    }
}

7
windowShouldClose 是一个委托方法,返回一个布尔值来确定窗口是否应该被允许关闭。你应该使用 windowWillClose。同时,你不需要在代码中手动终止应用程序。有一个 NSApplicationDelegate 方法可以放在你的 AppDelegate 中,当所有窗口关闭时将应用程序关闭。 func applicationShouldTerminateAfterLastWindowClosed(_ sender:NSApplication) -> Bool {return true} - Thomas Alvarez

3
您可以在ViewController类中使用“NSWindowDelegate”协议。(请参见此处的文档)
使您的类符合协议的方法:
class ViewController: NSObject, NSWindowDelegate

要检测窗口关闭按钮被点击的事件,使用windowShouldClose:
从文档中可以看出:

告诉代理用户已尝试关闭窗口[...]

在此方法中,您可以使用NSAlert提示用户是否真的想要关闭窗口。 编辑(响应@Mr Beardsley的评论)
要使您的ViewController成为代理,请使用:
window.delegate = self

self是视图控制器,window是正在使用的窗口时。您可以将此代码放在viewDidLoad:中。


谢谢你的回答。我设置了“class ViewController:NSObject,NSWindowDelegate”,并实现了windowShouldClose函数。但它不起作用。我相信我应该为窗口设置委托属性,但我不知道如何设置。 - Evgeniy
2
要从您的视图控制器设置委托,请执行以下操作:"window.delegate = self",在viewDidLoad中(只要您在10.10或更高版本)。您还需要对相关窗口进行引用或IBOutlet。 - Mr Beardsley

3
只需将此函数添加到 AppDelegate 中即可...
func applicationShouldTerminateAfterLastWindowClosed (_ theApplication: NSApplication) -> Bool {
    return true
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接