8
7

More than 5 years have passed since last update.

Swift Macアプリで、メインウインドウを閉じた時にアプリ自体を終了させる

Posted at

概要

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 のデリゲートを繋ぎ、デリゲートメソッドを書きます。

WindowController.swift
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 同様、扱うことが多いと思いますので最初にカスタムクラス化しておくと便利ではないでしょうか。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7