为什么这个SwiftUI选取器代码不起作用



Xcode:111.2.1

下面的代码用于一个包含两个组件的简单表单;选取器(用于选择字母(和文本(用于显示所选字母(。代码编译并运行,但当选择一个字母时,它不会出现在"selected…"文本中。此外,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")
}
}
}

信息:运行时警告:

[TableView]警告一次:UITableView被告知要布局其不在视图层次结构中的可见单元格和其他内容(表视图或其一个超视图尚未添加到窗口(。这可能会迫使表视图中的视图在没有准确信息的情况下加载和执行布局(例如表格视图边界、特征集合、布局边距、安全区域镶嵌等(,以及由于额外的布局,还会导致不必要的性能开销通过。在处设置符号断点UITableViewAlertForLayoutOutsideViewHierarchy在调试器,并查看是什么导致了这种情况的发生,这样您就可以避免这种情况如果可能的话,完全执行操作,或者推迟到表视图已添加到窗口中。表格视图:&lt_TtC7SwiftUIP3_BFB370BA5F1BADDC9D83021565761A4925更新合并表视图:0x7f8b3872600;baseClass=UITableView;帧=(0;414 896(;clipseToBounds=是;autoresize=W+H;gestureRecognizers=;层=;contentOffset:{0,-140};contentSize:{414205.333333333333 7};adjustedContentInset:{140,0,34,0};数据来源:&lt_TtGC7SwiftUIP10$10f5cd23419 ListCoreCordinator GVS_20系统ListDataSourceOs5Never_GOS_19选择管理器框S2___:0x7f8b33407a70>>

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")
}
}

为了记录在案,我根据上面接受的答案和我因该答案而增加的知识来回答我自己的问题。在这个问题中,我不是从数组中选择一个字母,而是数组中字母的索引。因此,根据这一见解,另一种可行的解决方案可能是:

struct ContentView: View {
@State private var letterIndex = 0
private let letters = ["Alpha", "Bravo", "Charlie"]
var body: some View {
NavigationView {
Form {
Picker("Select a letter", selection: $letterIndex) {
ForEach(0..<letters.count) { index in
Text(self.letters[index])
}
}
Text("Selected letter: (letters[letterIndex])")
}
.navigationBarTitle("Main Menu")
}
}

最新更新