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

Posted

技术标签:

【中文标题】为啥这个 SwiftUI Picker 代码不起作用?【英文标题】:Why does this SwiftUI Picker code not work?为什么这个 SwiftUI Picker 代码不起作用? 【发布时间】:2019-11-15 15:52:53 【问题描述】:

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 uitableview clipstobounds="YES;自动调整大小" w>>

【问题讨论】:

【参考方案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")
    

【讨论】:

谢谢,成功了。但是,我仍然收到运行时警告。我的猜测是它正在生成,因为文本字段正在更新,即使在显示 Picker 时它不可见。【参考方案2】:

为了记录,我正在根据上面接受的答案以及由于该答案而增加的知识来回答我自己的问题。在问题中,我没有从数组中选择一个字母,而是选择了数组中字母的 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")
    

【讨论】:

所以这个版本没有收到警告?这是一个问题?

以上是关于为啥这个 SwiftUI Picker 代码不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中,我如何知道 Picker 选择何时更改?为啥 didSet 不起作用?

iOS 15 SwiftUI 3 Picker 绑定在更改@State 值后不起作用

SwiftUI 中的一排 Picker ***,为啥拖动滚动区域从屏幕上的 Picker 控件偏移?

为啥 pop to root 在这个示例代码 SwiftUI 中不起作用?

每次渲染正文时都会调用 SwiftUI Picker onReceive()

SwiftUI 中的 Picker 适用于 ForEach 的一个版本,但不适用于另一个版本 - 错误或预期行为?