概要
mac アプリで、メインウインドウの左上クローズボタンを押した時、プロセスを終了させる方法。
デフォルトだと、ウインドウは閉じるけどドックからは取り除かれない。
方向性
方法としてはいくつかありますが、基本的には
- メインウインドウのインスタンスを取得
- そのデリゲートメソッド windowWillClose 内で、アプリ終了コードを書く
となります。
AppDelegate 内で、(ストーリーボード → IBOutlet なんかで) メインウインドウのインスタンスを取得できると思ったけどうまくできなかったので、結局 WindowController のカスタムクラスを書くことにしました。
実装方法
mac アプリを Xcode から新規プロジェクトで作る際、NSViewController の独自クラス (デフォルト名 ViewController ) を自動的に作ってくれますが、これと同様に UIWindowController の独自クラスを作ります。
- File -> New -> File...
- Cocoa Class を選択して Next
Class: WindowController
Subclass of: NSWindowController
Language: Swift
→ クラスファイル作成。ストーリーボードを開き、Window Controller Scene の中の Window Controller を選択。
右ペインの Custom Class の Class 欄に、WindowController を指定。さっき作ったクラス。
これで、WindowController を独自にいじれるようになりましたので、中の UIWindow のデリゲートを繋ぎ、デリゲートメソッドを書きます。
import Cocoa
class WindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()
self.window!.delegate = self
}
}
extension WindowController: NSWindowDelegate {
func windowWillClose(notification: NSNotification) {
NSApplication.sharedApplication().terminate(NSApp.keyWindow!)
}
}
UIWindowのインスタンスは self.window で取得できますので、このようにしてデリゲートを書いてやれば良いでしょう。
WindowController は ViewController 同様、扱うことが多いと思いますので最初にカスタムクラス化しておくと便利ではないでしょうか。