1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftUIのMenuを選択しても出しっぱなしにする

1
Posted at

はじめに

SwiftUIの Menu は通常、いずれかを選択するとMenuのUIが自動的に閉じます
設定メニューのように複数の項目を連続して操作したい場合は、選択しても閉じない方が便利です
menuActionDismissBehavior というAPIで実現できます

output-palette.gif

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) を付けるだけです

PickerMenu の中に入れると、選択中の項目に自動でチェックマークが付きます
$viewMode に直接バインドしているため、タップするだけで状態とチェックマークが同時に更新されます

おわりに

menuActionDismissBehavior(.disabled)Menu に付けるだけで、Menuを閉じずに選択状態を更新できました

今までは設定のために設定画面を作っていましたが、簡単な設定内容であればMenuで充足しそうです

pushすると画面遷移して元画面の作業のコンテキストが一度切れてしまいますし、Navigation Barのボタンを押すと下からハーフモーダルというのもパタパタしてしまいます
個人的には小さい設定であれば、Menuを活用するのが良さそうと思いました

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?