SwiftUI macOSでmakeKeyAndOrderFrontが機能しない場合

SwiftUI macOSでmakeKeyAndOrderFrontが機能しない場合

Xcode 12.3macOSアプリのプロジェクトをSwiftUIで作成した場合、windowをClose()してしまうとmakeKeyAndOrderFront()が機能しませんでした。makeKeyAndOrderFrontは、ウィンドウを表示させるメソッドでNSWindowに入っています。

macOSアプリ内でウィンドウを閉じた場合再表示できない原因は、NSWindowControllerで所有していないwindowは、ウィンドウが閉じられると解放してしまうためでした。

これらを回避してmakeKeyAndOrderFrontを機能させる方法の一つは、windowを閉じない処理を入れた[NSWindowをラップしたクラス]を作ってclose()をoverrideする。

class Window: NSWindow {
    override func close() {
        self.orderOut(NSApp)
    }
}

別の方法としては、SwiftUIでアプリ作成の場合ObservableObject継承したクラスを作成すると思うので、そのクラス内にでもNSWindowControllerを入れてしまう。

windowController = NSWindowController(window: window)

NSWindowControllerinitpublic init(window: NSWindow?)があるのでそこにAppDelegateなどで作ったwindowを入れます。

この2つの方法どちらかでmakeKeyAndOrderFrontが機能し閉じてもウィンドウが再表示されました。