SwiftUI - 表单选择器 - 如何防止导航回所选内容?

Tha*_*yen 4 forms picker swift swiftui

我正在使用 SwiftUI 实现 Form 和 Picker。有一个问题,当我选择选取器选项时,它会自动导航回表单屏幕,如何使其保持在选择屏幕中?

代码:

struct ContentView: View {
    @State private var selectedStrength = "Mild"
    let strengths = ["Mild", "Medium", "Mature"]

    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker("Strength", selection: $selectedStrength) {
                        ForEach(strengths, id: \.self) {
                            Text($0)
                        }
                    }
                }
            }
            .navigationTitle("Select your cheese")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实际的:

在此输入图像描述

预期:(来自 Iphone 设置的示例)

在此输入图像描述

cla*_*ome 5

您可能必须制作一个模仿选择器外观的自定义视图:

struct ContentView: View {

    let strengths = ["Mild", "Medium", "Mature"]
    
    @State private var selectedStrength = "Mild"
    
    var body: some View {
        NavigationView {
            Form {
                Section {
                    NavigationLink(destination: CheesePickerView(strengths: strengths, selectedStrength: $selectedStrength)) {
                        HStack {
                            Text("Strength")
                            Spacer()
                            Text(selectedStrength)
                                .foregroundColor(.gray)
                        }
                    }
                }
            }
            .navigationTitle("Select your cheese")
        }
    }
}

struct CheesePickerView: View {
    
    let strengths: [String]
    @Binding var selectedStrength: String

    var body: some View {
        Form {
            Section {
                ForEach(0..<strengths.count){ index in
                    HStack {
                        Button(action: {
                            selectedStrength = strengths[index]
                        }) {
                            HStack{
                                Text(strengths[index])
                                    .foregroundColor(.black)
                                Spacer()
                                if selectedStrength == strengths[index] {
                                    Image(systemName: "checkmark")
                                        .foregroundColor(.blue)
                                }
                            }
                        }.buttonStyle(BorderlessButtonStyle())
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)