为什么这个 SwiftUI Picker 代码不起作用?

Vin*_*van 3 xcode picker swift swiftui

Xcode:11.2.1

下面的代码是一个包含两个组件的简单表单;选择器(选择字母)和文本(显示所选字母)。代码编译并运行,但是当选择一个字母时,它不会出现在“选定...”文本中。此外,第一次(仅)选择一个字母时,Xcode 会显示一个(虚假的?)运行时警告。

struct ContentView: View {

    @State private var letter = ""
    private let letters = ["Alpha", "Bravo", "Charlie"]

    var body: some View {
        NavigationView {
            Form {
                Picker("Select a letter", selection: $letter) {
                    ForEach(0..<letters.count) {
                        Text(self.letters[$0])
                    }
                }
                Text("Selected letter: \(letter)")
            }
            .navigationBarTitle("Main Menu")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有关信息:运行时警告:

[TableView] 仅警告一次:UITableView 被告知在不位于视图层次结构中的情况下布局其可见单元格和其他内容(表视图或其超级视图之一尚未添加到窗口中)。这可能会因为在没有准确信息(例如表视图边界、特征集合、布局边距、安全区域插入等)的情况下强制表视图内的视图加载和执行布局而导致错误,并且还会因额外的布局传递而导致不必要的性能开销。在 UITableViewAlertForLayoutOutsideViewHierarchy 处设置一个符号断点,以在调试器中捕获此情况并查看导致此情况发生的原因,因此您可以在可能的情况下完全避免此操作,或者将其推迟到表视图添加到窗口中为止。表视图:<_TtC7SwiftUIP33_BFB370BA5F1BADDC9D83021565761A4925UpdateCoalescingTableView:0x7f8b33872600;基类 = UITableView; 帧=(0 0;414 896);剪辑边界=是;自动调整大小=W+H;手势识别器 = ; 层=; 内容偏移:{0,-140};内容大小:{414,205.33333333333337};调整后的内容插入: {140, 0, 34, 0}; 数据源:<_TtGC7SwiftUIP10 $10f5cd23419ListCoreCoordinatorGVS_20SystemListDataSourceOs5Never_GOS_19SelectionManagerBoxS2___:0x7f8b33407a70>>

Asp*_*eri 5

Picker 中的 ForEach 类型应与选择类型对齐。

这是一个应该适合您的更正代码:

@State private var letter = ""
private let letters = ["Alpha", "Bravo", "Charlie"]

var body: some View {
    NavigationView {
        Form {
            Picker("Select a letter", selection: $letter) {
                ForEach(letters, id: \.self) { option in
                    Text(option)
                }
            }
            Text("Selected letter: \(letter)")
        }
        .navigationBarTitle("Main Menu")
    }
}
Run Code Online (Sandbox Code Playgroud)