Evg*_*niy 6 macos nsviewcontroller nswindowcontroller swift
如何使用swift处理窗口的关闭事件,例如,询问"你确定要关闭表单吗?"
表格将在"是"的情况下关闭,在"否"的情况下不关闭.显示消息框对我来说不是问题.
viewWillDisappear()也适用于最小化,但我只需要关闭事件.
谢谢.
Tho*_*rez 13
如上所述,你应该做ViewController一个NSWindowDelegate,但你应该处理windowWillClose,而不是windowShouldClose.windowShouldClose是确定窗口是否能够关闭,而不是窗口实际关闭的事件.
我还发现你需要设置delegatein viewDidAppear,而不是viewDidLoad.对我来说self.view.window还没有定义viewDidLoad.
override func viewDidAppear() {
self.view.window?.delegate = self
}
Run Code Online (Sandbox Code Playgroud)
我也有相同的查询,使用此处详细解释的方法解决它:使用XCode Swift 3关闭窗口时退出Cocoa App
它需要三个步骤:
添加的代码应如下所示:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
您可以NSWindowDelegate在 ViewController 类中使用该协议。(请参阅此处的文档)
为了使你的类符合协议:
class ViewController: NSObject, NSWindowDelegate
Run Code Online (Sandbox Code Playgroud)
要检测何时单击窗口的关闭按钮,请使用windowShouldClose:
来自文档:
告诉委托人用户已尝试关闭窗口 [...]
在此方法中,您可以使用NSAlert来提示用户是否确实要关闭窗口。
编辑(回应@比尔兹利先生的评论)
要使您的 ViewController 成为委托,请使用:
window.delegate = self
Run Code Online (Sandbox Code Playgroud)
selfViewController 在哪里,window您正在使用的窗口在哪里。你可以把这个放进去viewDidLoad:。