🍁

Swift: アプリがアクティブになったらウィンドウを最前面に表示する

2021/01/13に公開

何かしらのウィンドウがすでに画面上にある時はそれを最前面に出して、ウィンドウがない場合はWindowControllerをインスタンス化してウィンドウを表示する。
applicationDidBecomeActive(_:)を使うことでアクティブになった時をトリガーできる。

AppDelegate.swift
import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    private var windowController: NSWindowController?

    func applicationDidBecomeActive(_ notification: Notification) {
        if NSApp.orderedWindows.isEmpty {
            openWindowController()
        }
	// 特に何もしなくてもウィンドウがある時、
	// アプリがアクティブになるともともとの重なり順でウィンドウが表示される
    }

    func openWindowController() {
        if windowController == nil {
            // WindowControllerの初期化
            windowController = NSWindowController()
            windowController?.window?.delegate = self
        }
        NSApp.activate(ignoringOtherApps: true)
        windowController?.showWindow(nil)
    }

}


extension AppDelegate: NSWindowDelegate {

    func windowWillClose(_ notification: Notification) {
        guard let window = notification.object as? NSWindow else { return }
        if window === windowController?.window {
            windowController = nil
        }
    }

}

Discussion