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"`のウインドウが起動時に表示される
}
}
今回はこれらを開いたり閉じたりする方法を挙げてみよう。
Share
リンクも共有もお気軽に。記事を書くモチベーションの向上に役立てます。