SwiftUI:NavigationBarItem 的 ContextMenu 中的 Picker 问题

SwiftUI: Problem with Picker inside ContextMenu of NavigationBarItem

我正在尝试在 navigationBarItems.contextMenu 上使用 Picker。但是,行为并不像我预期的那样,我无法判断这是 Apple 错误还是我做错了什么 (XCode 13.4)。 用户从下拉列表中选择一个项目后,变量值发生变化但重新打开上下文菜单,错误的项目被标记为“已选择”。

我已经创建了最基本的演示来说明它。真实设备上的行为相同 (iPhone 11 / iOS 15.4.1).

struct ContentView: View {
    @State private var isAutoRefresh = true

    var body: some View {
        NavigationView {
            Text("Auto refresh is: \(String(isAutoRefresh))")
                .navigationBarTitle("Demo")
                .navigationBarItems(
                    trailing:
                        Button(action: {}, label: {
                            Image(systemName: "arrow.clockwise")
                        })
                        .contextMenu {
                            Picker(selection: self.$isAutoRefresh, label: Text("")) {
                                Text("Manual refresh").tag(false)
                                Text("Auto refresh").tag(true)
                            }
                            .pickerStyle(InlinePickerStyle())
                        }
                )
        }
    }
}

这是一个错误吗?我可以使用任何解决方法吗?

上下文菜单创建一次并缓存,因此我们需要在外部发生任何更改后重建它。

这是一个修复程序。使用 Xcode 13.3 / iOS 15.4

测试
.contextMenu {
    Picker(selection: self.$isAutoRefresh, label: Text("")) {
        Text("Manual refresh").tag(false)
        Text("Auto refresh").tag(true)
    }
    .pickerStyle(InlinePickerStyle())
}.id(isAutoRefresh)                    // << here !!

替代: 只是为了使用 Menu 而不是 Button 和上下文菜单(如果设计适用),比如

Menu {
         Picker(selection: self.$isAutoRefresh, label: Text("")) {
              Text("Manual refresh").tag(false)
              Text("Auto refresh").tag(true)
         }
         .pickerStyle(InlinePickerStyle())
    } label: {
         Image(systemName: "arrow.clockwise")
    }