はじめに
SwiftUIの Menu は通常、いずれかを選択するとMenuのUIが自動的に閉じます
設定メニューのように複数の項目を連続して操作したい場合は、選択しても閉じない方が便利です
menuActionDismissBehavior というAPIで実現できます
UIKit版はこちら
使うAPI
menuActionDismissBehavior
Menu に付けるモディファイアです
.disabled を渡すと、アクション実行後もメニューを閉じずに表示し続けます
実装
セットアップ
struct ContentView: View {
enum ViewMode {
case list, grid
}
@State private var viewMode: ViewMode = .list
var body: some View {
NavigationStack {
// ...
}
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
Menu {
Picker("表示モード", selection: $viewMode) {
Label("リスト", systemImage: "list.bullet")
.tag(ViewMode.list)
Label("グリッド", systemImage: "square.grid.2x2")
.tag(ViewMode.grid)
}
} label: {
Image(systemName: "gear")
}
.menuActionDismissBehavior(.disabled)
}
}
}
}
Menu に .menuActionDismissBehavior(.disabled) を付けるだけです
Picker を Menu の中に入れると、選択中の項目に自動でチェックマークが付きます
$viewMode に直接バインドしているため、タップするだけで状態とチェックマークが同時に更新されます
おわりに
menuActionDismissBehavior(.disabled) を Menu に付けるだけで、Menuを閉じずに選択状態を更新できました
今までは設定のために設定画面を作っていましたが、簡単な設定内容であればMenuで充足しそうです
pushすると画面遷移して元画面の作業のコンテキストが一度切れてしまいますし、Navigation Barのボタンを押すと下からハーフモーダルというのもパタパタしてしまいます
個人的には小さい設定であれば、Menuを活用するのが良さそうと思いました
