表单中的SwiftUI Picker不显示选中标记

时间:2019-09-25 17:08:14

标签: ios swiftui

我在Form中嵌入了一个Picker,但是在表单中显示一个选中标记和选定的值时,我却无法正常工作。

NavigationView {
    Form {
        Section {
                Picker(selection: $currencyCode, label: Text("Currency")) {
                    ForEach(0 ..< codes.count) {
                        Text(self.codes[$0]).tag($0)
                    }
                }
            }
    }
}

No checkmark and no selected value

2 个答案:

答案 0 :(得分:2)

很难说,您在做什么错,因为您的示例未包含codescurrencyCode的声明。我怀疑问题在于绑定的类型与您在选择器上设置的标记的类型不同(在您的情况下为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

您的变量currencyCodeForEach中每个元素的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])
                        }
                    }
                }
            }
        }
    }
}