[macOS App]Dockアイコンをクリックした時に隠したNSWindowを表示する

Updated
Nov 22, 2019 10:28 AM
Created
Nov 9, 2019 7:28 PM
Tags
SwiftMemo
Keywords
Date

MacApp/CocoaApp macOSアプリのことをなんて呼べばいいのか分かりませんが、

とりあえず、macOS Appと呼びましょうか。

これを作り始めて真っ先にハマるのが、

アプリを起動するとWindowが表示されるが、これを閉じたあとにDockアイコンをクリックすることで表示するにはどうしたらよいか?

という問題です。

毎回調べるので、やっと自分のノートにも書いておくとします。

前提、NSWindowを自動で解放されないようにする

最初の前提として、表示しているWindowが再表示可能な状態になっていることを確認します。

window.isReleasedWhenClosed = false

これがデフォルトではtrueなようで、Windowを閉じればリリースされます。

NSWindowの参照を保持していたとしても、実体はなくなり、ポインタが残るだけのような状態となります。

なので、まずはWindowを閉じてもリリースされないように、Windowの設定を上記のように設定しておきます。

というところまでが、まず前提

Dock アイコンのクリックをハンドルする

DockアイコンがクリックされるとAppDelegateの次のメソッドが呼び出されます。

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool

例えば次のようなコードを記述すればNSApplicationが持つ、すべてのWindowを表示することができます。

func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
  sender.windows.forEach {
    $0.makeKeyAndOrderFront(self)
  }
  return true
}

Nov 22, 2019

ちょっと追記

NSWindowを閉じるとDockからアイコンが消える問題の対処法