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

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)

  • 将 ViewController 设置为 ViewController 所代表的 Window 的委托。它允许符合 NSWindowDelegate 协议的 ViewController 实际充当委托。 (2认同)
  • 谢谢.使用viewDidAppear为我工作. (2认同)

Nab*_*han 8

我也有相同的查询,使用此处详细解释的方法解决它:使用XCode Swift 3关闭窗口时退出Cocoa App

它需要三个步骤:

  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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • windowShouldClose是一个委托方法,它返回一个布尔值,以确定是否允许窗口关闭.你应该使用windowWillClose.您也不需要在代码中手动终止应用程序.您可以在AppDelegate中放置一个NSApplicationDelegate方法,以便在所有窗口关闭时关闭应用程序.func applicationShouldTerminateAfterLastWindowClosed(_ sender:NSApplication) - > Bool {return true} (3认同)

Arc*_*676 3

您可以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:

  • 要从视图控制器设置委托,只需在 viewDidLoad 中执行以下操作:“window.delegate = self”(只要您使用的是 10.10 或更高版本)。您还需要相关窗口的参考或 IBOutlet。 (2认同)