禁用 SwiftUI 中的选取器选项

S. *_*han 8 swift swiftui

我正在尝试禁用 swiftUI 中的 Picker 选项。根据下面的文档,代码应该可以工作:


struct ContentView: View {
    let options = ["All", "Men", "Women", ]
    @State private var selectedOption = "All"

    var body: some View {
        Picker("Options", selection: $selectedOption) {
            ForEach(options, id: \.self) { option in
                Text(option)
                    .disabled(option == "All")
            }
        }
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Run Code Online (Sandbox Code Playgroud)

不幸的是,它在我出错的地方不起作用。有人可以帮忙吗!?

小智 4

您无法禁用 SwiftUI Picker 中的选项。禁用修饰符可以应用于整个选择器。因此一种方法是,您可以在添加到选择器时过滤选项。

let options = ["All", "Men", "Women"]
    @State private var selectedOption = "Men"

    var body: some View {
        Picker("Options", selection: $selectedOption) {
            ForEach(options, id: \.self) { option in
                if option != "All" {
                    Text(option)

                }
            }
        }
    } 
Run Code Online (Sandbox Code Playgroud)

另一种选择是,您可以使用SwiftUI Menu制作自定义选取器并获得预期结果。在这里您可以禁用任何您想要的选项,

       let options = ["All", "Men", "Women"]
        @State private var selectedOption = "Men"

        var body: some View {
            Menu {
                ForEach(options, id: \.self) { option in
                    if option == "All" {
                        Button(action: {}) {
                            Text(option)
                                .foregroundColor(.gray)
                        }
                        .disabled(true)
                    } else {
                        Button(action: {
                            selectedOption = option
                        }) {
                            Text(option)
                        }
                    }
                }
            } label: {
                Text(selectedOption)
                    .foregroundColor(.primary)
                    .padding(.horizontal)
            }
            .padding(.horizontal)
        }
Run Code Online (Sandbox Code Playgroud)