swift OSXで最小化からの復帰および終了ボタンを押した時に終了させるようにする

macというOSは、終了ボタンを押しても終了せずにdockに残ってしまうようにできている。
そしてデフォルトでは最小化を押したら復帰しないようになっている。
ってことで、先日出したアプリがreopenできるようにしろとリジェクトされてしまった。
そんなわけで対処法をメモしておきます。



まず最小化からの復帰。
これはAppDelegate.swiftに追加すればOKです。
こんな感じのコードを入れてあげましょう。


func applicationShouldHandleReopen(sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
if let firstWindow = sender.windows.first {
firstWindow.makeKeyAndOrderFront(sender)
}
return true
}


これで最小化させてもアイコンクリックで復帰します。

アプリを終了させる


続いてアプリを終了させる方法。
適当にググるとapplicationShouldTerminateAfterLastWindowClosedってのを使えと出てきますが、swift3はAppDelegateにこれ入れても駄目。
終了するのはアプリじゃなくてViewだからなのか知らんけど、とりあえずViewControllerに細工がいります。

まずはViewControllerのインターフェースにNSWindowDelegateを追加。


class ViewController: NSViewController, NSWindowDelegate {


続いてNSWindowと結びつけます。

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


viewDidLoadじゃ駄目らしいので、viewDidAppearを作りましょ。
そして最後にwindowをクローズさせたときの処理を追加。


func windowShouldClose(_ sender: Any) {
NSApplication.shared().terminate(self)
}


NSAlertとかで確認ダイアログ入れればキャンセルできるようにもできます。
しかし相変わらず情報が少ないですなあ。