我在Form中嵌入了一个Picker,但是在表单中显示一个选中标记和选定的值时,我却无法正常工作。
NavigationView {
Form {
Section {
Picker(selection: $currencyCode, label: Text("Currency")) {
ForEach(0 ..< codes.count) {
Text(self.codes[$0]).tag($0)
}
}
}
}
}
答案 0 :(得分:2)
很难说,您在做什么错,因为您的示例未包含codes
或currencyCode
的声明。我怀疑问题在于绑定的类型与您在选择器上设置的标记的类型不同(在您的情况下为Int)。
无论如何,这可行:
struct ContentView: View {
let codes = Array(CurrencyCode.allCases)
@State private var currencyCode: CurrencyCode?
var body: some View {
NavigationView {
Form {
Section {
Picker("Currency",
selection: $currencyCode) {
ForEach(codes, id: \.rawValue) {
Text($0.rawValue).tag(Optional<CurrencyCode>.some($0))
}
}
}
}
}
}
}
enum CurrencyCode: String, CaseIterable {
case eur = "EUR"
case gbp = "GBP"
case usd = "USD"
}
答案 1 :(得分:2)
TL; DR
您的变量currencyCode
与ForEach
中每个元素的ID类型都不匹配。遍历ForEach
中的代码,或为Picker
传递索引。
下面是三个等效的示例。请注意,传递给@State
的{{1}}变量始终与Picker
进行迭代的元素的ID相匹配:
还请注意,我为ForEach
变量选择了一个默认值,该默认值不在数组中(“”,-1,UUID()),因此在加载表单时未显示任何内容。如果要使用默认选项,只需将@State
变量设为默认值即可。
示例1:遍历代码(即字符串)
@State
示例2:迭代索引(即Int)
struct ContentView: View {
@State private var currencyCode: String = ""
var codes: [String] = ["EUR", "GBP", "USD"]
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $currencyCode, label: Text("Currency")) {
// ID is a String ----v
ForEach(codes, id: \.self) { (string: String) in
Text(string)
}
}
}
}
}
}
}
示例3:根据其ID类型(即UUID)遍历可识别的结构
struct ContentView: View {
@State private var selectedIndex: Int = -1
var codes: [String] = ["EUR", "GBP", "USD"]
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $selectedIndex, label: Text("Currency")) {
// ID is an Int --------------v
ForEach(codes.indices, id: \.self) { (index: Int) in
Text(self.codes[index])
}
}
}
}
}
}
}