Xcode:11.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上创建一个符号断点,以在调试器中捕获该断点,并查看引起此情况的原因,因此,如果可能,您可以完全避免执行此操作,或者将其推迟到将表视图添加到窗口中。表格视图:<_TtC7SwiftUIP33_BFB370BA5F1BADDC9D83021565761A4925UpdateCoalescingTableView:0x7f8b33872600; baseClass = UITableView;框架=(0 0; 414 896); clipsToBounds = YES;自动调整大小= W + H; poseRecognizers =;层=; contentOffset:{0,-140}; contentSize:{414,205.33333333333337}; AdjustedContentInset:{140,0,34,0}; dataSource:<_TtGC7SwiftUIP10 $ 10f5cd23419ListCoreCoordinatorGVS_20SystemListDataSourceOs5Never_GOS_19SelectionManagerBoxS2 ___:0x7f8b33407a70 >>
答案 0 :(得分:1)
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")
}
}
答案 1 :(得分:0)
仅作记录,我要根据上面接受的答案回答我自己的问题,并根据该答案增加我的知识。在这个问题中,我不是从数组中选择字母,而是在数组中选择字母的 index 。因此,根据这些见解,替代的可行解决方案可能是:
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")
}
}