たとえば、Swiftを使用してウィンドウの閉じるイベントを処理し、「フォームを閉じてもよろしいですか?」と尋ねる方法。
フォームは、「はい」の場合は閉じられ、「いいえ」の場合は閉じられません。メッセージボックスを表示することは私にとって問題ではありません。
viewWillDisappear()は最小化にも機能しますが、必要なのはcloseイベントだけです。
ありがとう。
上記のように、ViewController
をNSWindowDelegate
にする必要がありますが、windowWillClose
ではなくwindowShouldClose
を処理する必要があります。 windowShouldClose
は、ウィンドウが実際に閉じているというイベントではなく、ウィンドウを閉じることができるかどうかを判断するためのものです。
また、delegate
ではなくviewDidAppear
にviewDidLoad
を設定する必要があることもわかりました。私のために self.view.window
はviewDidLoad
でまだ定義されていません。
override func viewDidAppear() {
self.view.window?.delegate = self
}
私も同じクエリを持っていました、ここで詳細に説明されている方法を使用してそれを解決しました: XCodeを使用してウィンドウを閉じるときにCocoaアプリを終了します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)
}
}
ViewControllerクラスでNSWindowDelegate
プロトコルを使用できます。 ( ここのドキュメント を参照してください)
クラスをプロトコルに準拠させるには:
class ViewController: NSObject, NSWindowDelegate
ウィンドウの閉じるボタンがクリックされたことを検出するには、windowShouldClose:
を使用します
ドキュメントから:
ユーザーがウィンドウを閉じようとしたことを代理人に通知します[...]
このメソッドでは、 NSAlert を使用して、ユーザーが本当にウィンドウを閉じたいかどうかをユーザーに確認できます。
[〜#〜]編集[〜#〜](@ Mr Beardsleyのコメントに応えて)
ViewControllerをデリゲートにするには、次を使用します。
window.delegate = self
ここで、self
はViewControllerであり、window
は使用しているウィンドウです。これをviewDidLoad:
に入れることができます。