web-dev-qa-db-ja.com

Swift)でウィンドウのクローズイベントを処理します

たとえば、Swiftを使用してウィンドウの閉じるイベントを処理し、「フォームを閉じてもよろしいですか?」と尋ねる方法。

enter image description here

フォームは、「はい」の場合は閉じられ、「いいえ」の場合は閉じられません。メッセージボックスを表示することは私にとって問題ではありません。

viewWillDisappear()は最小化にも機能しますが、必要なのはcloseイベントだけです。

ありがとう。

8
Evgeniy

上記のように、ViewControllerNSWindowDelegateにする必要がありますが、windowWillCloseではなくwindowShouldCloseを処理する必要があります。 windowShouldCloseは、ウィンドウが実際に閉じているというイベントではなく、ウィンドウを閉じることができるかどうかを判断するためのものです。

また、delegateではなくviewDidAppearviewDidLoadを設定する必要があることもわかりました。私のために self.view.windowviewDidLoadでまだ定義されていません。

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

私も同じクエリを持っていました、ここで詳細に説明されている方法を使用してそれを解決しました: XCodeを使用してウィンドウを閉じるときにCocoaアプリを終了しますSwift

3つのステップが必要です。

  1. ViewControllerクラスのtoNSWindowDelegateに準拠します
  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)
    }
}
8
Nabeel Khan

ViewControllerクラスでNSWindowDelegateプロトコルを使用できます。 ( ここのドキュメント を参照してください)

クラスをプロトコルに準拠させるには:

class ViewController: NSObject, NSWindowDelegate

ウィンドウの閉じるボタンがクリックされたことを検出するには、windowShouldClose:を使用します

ドキュメントから:

ユーザーがウィンドウを閉じようとしたことを代理人に通知します[...]

このメソッドでは、 NSAlert を使用して、ユーザーが本当にウィンドウを閉じたいかどうかをユーザーに確認できます。

[〜#〜]編集[〜#〜](@ Mr Beardsleyのコメントに応えて)

ViewControllerをデリゲートにするには、次を使用します。

window.delegate = self

ここで、selfはViewControllerであり、windowは使用しているウィンドウです。これをviewDidLoad:に入れることができます。

3
Arc676