[英]SwiftUI Picker Help — Populating picker based on the selection of another picker
我正在尝试根据另一个选择器的选择来填充一个选择器。 我是 Swift 的新手,并且在这个问题上困扰我太久了。 我确信它没有我做的那么困难,但我会很感激任何帮助。
我认为我最大的问题是将第一个选择器的选择传递给第二个选择器的数组名称。 我使用过开关盒,试图传递选择原始值......等等。 下面是我希望它在没有选择器绑定的情况下看起来的示例。 谢谢
import SwiftUI
struct veggie: View {
let veggies = ["Beans", "Corn", "Potatoes"]
let beanList = ["Pole", "String", "Black"]
let cornList = ["Peaches & Cream", "Sweet"]
let potatoList = ["Yukon Gold", "Idaho"]
@State private var selectedVeggie = "Bean"
@State private var selectedBean = "Pole"
@State private var selectedType = ""
var body: some View {
NavigationView{
VStack{
Form{
Picker("Please choose a veggie", selection: $selectedVeggie)
{
ForEach(veggies, id: \.self) {
Text($0)
}
}
Text("You selected \(selectedVeggie)")
Picker("Type", selection: $selectedBean)
{
ForEach(beanList, id: \.self) {
Text($0)
}
}
}
} .navigationTitle("Veggie Picker")
}
}
}
我想象你希望这有点动态,而不是用if
语句硬编码。 为了实现这一点,我设置了一个包含蔬菜类型的enum
,然后是一个将蔬菜类型映射到其子类型的字典。 那些看起来像:
enum VeggieType : String, CaseIterable {
case beans, corn, potatoes
}
let subTypes : [VeggieType: [String]] = [.beans: ["Pole", "String", "Black"],
.corn: ["Peaches & Cream", "Sweet"],
.potatoes: ["Yukon Gold", "Idaho"]]
然后,在视图中,我这样做了:
struct ContentView: View {
@State private var selectedVeggie : VeggieType = .beans
@State private var selectedSubtype : String?
var subtypeList : [String] {
subTypes[selectedVeggie] ?? []
}
var body: some View {
NavigationView{
VStack{
Form{
Picker("Please choose a veggie", selection: $selectedVeggie)
{
ForEach(VeggieType.allCases, id: \.self) {
Text($0.rawValue.capitalized)
}
}
Text("You selected \(selectedVeggie.rawValue.capitalized)")
Picker("Type", selection: $selectedSubtype)
{
ForEach(subtypeList, id: \.self) {
Text($0).tag($0 as String?)
}
}
}
} .navigationTitle("Veggie Picker")
}
}
}
selectedVeggie
现在使用VeggieType
输入。 selectedSubtype
是一个没有初始值的可选String
(尽管您可以根据需要设置一个)。
第一个选择器遍历VeggieType
的所有案例。 第二个根据计算的属性subtypeList
动态更改,该属性从我之前制作的subTypes
字典中获取项目。
tag
项很重要——我必须将标记as String?
因为 SwiftUI 希望selection
参数和tag()
完全匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.