如何使用swift处理窗口的关闭事件,例如,询问“你确定要关闭表单吗?”
表格将在“是”的情况下关闭,在“否”的情况下不会关闭。显示消息框对我来说不是问题。
viewWillDisappear()也适用于最小化,但我只需要关闭事件。
感谢。
答案 0 :(得分:11)
如上所述,您应该将ViewController
设为NSWindowDelegate
,但应该处理windowWillClose
,而不是windowShouldClose
。 windowShouldClose
用于确定窗口是否能够关闭,而不是窗口实际关闭的事件。
我还发现您需要在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
需要三个步骤:
添加的代码应如下所示:
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
}