togo

= ひとりごと to go

zumuya の人による机の上系情報サイト

SwiftUI でウインドウを開く/閉じる

  • Apple
  • ソフトウェア
  • 開発

Apple にとって主力プラットフォームの iOS ですら機能不足だと言われ続けた SwiftUI もバージョンを重ね、最近は macOS でも実用的になってきた感じ。自分もこの数年は新規 Mac App を SwiftUI ベースにすることが多くなってる。

とはいえ SwiftUI って名前空間を贅沢に使いすぎるせいで API やそのドキュメントが分散しているし、名前も広いプラットフォームを想定した汎用的なもので逆にわかりにくかったりするのでせっかく用意された機能に気づかないまま別の API で遠回りしたり諦めてしまうことがよくある。なので基本っぽい機能でも一つのテーマで一箇所にまとめれば価値があるはず。…この手の記事を書いても最近は AI のエサにしかならないかもしれないけど、世に高品質な Mac App が生まれることに少しでも役立てばそれでいいのだ1

今日のテーマはウインドウ。macOS の SwiftUI ではウインドウを Window(_:id:content:) もしくは UtilityWindow(_:id:content:) で Scene として定義できる。名前のとおり前者が通常のウインドウなのに対して後者はユーティリティパネル2だ。同じ種類のウインドウを複数開く場合は WindowGroup を使おう。

ちなみに設定ウインドウは Settings で定義するし、アプリケーションが書類を扱う場合だと DocumentGroup というこれもまた Scene の一種を使うが話が長くなるので割愛したい。

Scene は App.body に並べて定義するが、ここで最も先頭に近い Window がアプリケーション起動時に自動的に表示されるウインドウとなる。それ以外のものはユーザが必要なときに開くオプションであり、ここでの定義順に“ウインドウ”メニュー内に項目として並び、ユーザがそれを選択したタイミングで初めて表示される。

@main
struct MyApp: App
{
    var body: some Scene
    {
        Window("MyApp", id: "main") {
            ContentView()
        }
        Window("Fruits", id: "fruits") {
            Text("🍎🍇🍓").font(.system(size: 36))
        }

        /// この場合は`id: "main"`のウインドウが起動時に表示される
    }
}
起動時に開くウインドウとそうでないウインドウ

今回はこれらを開いたり閉じたりする方法を挙げてみよう。

続きを読む


  1. 世のため人のためにやってるアピールではなく、世に高品質な macOS ネイティブなアプリケーションの選択肢が増えると自分が得する構図がある。 ↩︎

  2. 雑に言うとフォントパネルみたいにタイトルバーが細くてほかのウインドウより手前に表示されて表示主のアプリケーションが非アクティブになると隠れるやつ。AppKit だと StyleMask.utilityWindow で生成した NSPanel がこれだ。 ↩︎

Share

リンクも共有もお気軽に。記事を書くモチベーションの向上に役立てます。