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

时间:2019-11-15 15:52:53

标签: xcode swiftui

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 >>

2 个答案:

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