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

时间:2015-10-19 13:34:57

标签: macos swift nswindowcontroller nsviewcontroller

如何使用swift处理窗口的关闭事件,例如,询问“你确定要关闭表单吗?”

enter image description here

表格将在“是”的情况下关闭,在“否”的情况下不会关闭。显示消息框对我来说不是问题。

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

感谢。

4 个答案:

答案 0 :(得分:11)

如上所述,您应该将ViewController设为NSWindowDelegate,但应该处理windowWillClose,而不是windowShouldClosewindowShouldClose用于确定窗口是否能够关闭,而不是窗口实际关闭的事件。

我还发现您需要在delegate中设置viewDidAppear,而不是viewDidLoad。对于我self.view.window尚未定义viewDidLoad

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

答案 1 :(得分:7)

我也有相同的查询,使用此处详细说明的方法解决了它:Quit Cocoa App when Window Close using XCode Swift 3

需要三个步骤:

  1. 在ViewController类中符合NSWindowDelegate
  2. 覆盖viewDidAppear方法
  3. 添加windowShouldClose方法
  4. 添加的代码应如下所示:

    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)
        }
    }
    

答案 2 :(得分:3)

您可以在ViewController类中使用NSWindowDelegate协议。 (见documentation here

使您的班级符合协议:

class ViewController: NSObject, NSWindowDelegate

要检测单击窗口的关闭按钮的时间,请使用windowShouldClose:

来自doc:

  

告诉代表用户试图关闭窗口[...]

在此方法中,您可以使用NSAlert提示用户是否确实要关闭窗口。

编辑(回应@Mr Beardsley的评论)

要使ViewController成为委托,请使用:

window.delegate = self

self是ViewController,window是您正在使用的窗口。您可以将其放在viewDidLoad:

答案 3 :(得分:0)

只需将此函数添加到 AppDelegate ...

func applicationShouldTerminateAfterLastWindowClosed (_ theApplication: NSApplication) -> Bool {
    return true
}