SwiftUI:添加元素时选择器内容未刷新

Posted

技术标签:

【中文标题】SwiftUI:添加元素时选择器内容未刷新【英文标题】:SwiftUI: Picker content not refreshed when adding Element 【发布时间】:2019-11-01 14:30:10 【问题描述】:

我在 VStack 中有一个 Picker 元素,但是当它的内容通过添加新元素而改变时,Picker 不会刷新。

隐藏并显示 Picker 后,新元素可见。

有人知道如何刷新 Picker 的内容,而不需要隐藏/显示吗?

您可以通过创建一个新的 SwiftUI 项目并复制以下代码而不是“ContentView”结构来重现这一点。

class ContentModel 
    @Published var pickerData: [String] = ["1"]

    func addPickerData() 
        pickerData.append("\(pickerData.count + 1)")
    


struct ContentView: View 
    let contentModel = ContentModel()

    @State private var showPicker = false
    @State private var selectedPickerValue = ""

    var body: some View 
        VStack(spacing: 8) 
            Text("Adding a new Element to the Picker does not refresh its content :-(")
            Button(action: 
                self.contentModel.addPickerData()
            ) 
                Text("Add Picker Data")
            
            Button(action: 
                self.showPicker.toggle()
            ) 
                Text("Show / Hide 2nd Picker")
            
            Picker("Select",selection: $selectedPickerValue) 
                ForEach(contentModel.pickerData, id: \.self)  data in
                    Text(data)
                
            
            if (showPicker) 
                Picker("Select",selection: $selectedPickerValue) 
                    ForEach(contentModel.pickerData, id: \.self)  data in
                        Text(data)
                    
                
            
            Text("Selected Value: \(selectedPickerValue)")
        
    

提前感谢您的帮助!

【问题讨论】:

以下无效:***.com/questions/57967784/… 我有一个与轮式选择器类似的问题,但仍未解决。那些 SwiftUI 的 bug 真的很烦人:***.com/q/59224408/10826194 【参考方案1】:

这是反应式的技巧,当您需要刷新某些内容时,请始终使用相同内容的两个副本。

 class ContentModel
 @Published var pickerData: [String] = ["1"]

   func addPickerData() 
       pickerData.append("\(pickerData.count + 1)")
   



struct ContentSSView: View 
let contentModel = ContentModel()

@State private var showPicker = false
@State private var selectedPickerValue = ""

var body: some View 
    VStack(spacing: 8) 
        Text("Adding a new Element to the Picker does not refresh its content :-(")
        Button(action: 
            self.contentModel.addPickerData()
             self.showPicker.toggle()
        ) 
            Text("Add Picker Data")
        
        Button(action: 
            self.showPicker.toggle()
        ) 
            Text("Show / Hide 2nd Picker")
        

        if (showPicker) 
            Picker("Select",selection: $selectedPickerValue) 
                ForEach(contentModel.pickerData, id: \.self)  data in
                    Text(data)
                
            
        else
            Picker("Select",selection: $selectedPickerValue) 
                ForEach(contentModel.pickerData, id: \.self)  data in
                    Text(data)
                
            
        
        Text("Selected Value: \(selectedPickerValue)")
    

【讨论】:

【参考方案2】:

我有一个关于这个问题的 GitHub 存储库。我不认为拥有两个 Picker 是一个可行的解决方案。

Picker Update Bug GitHub Repo

【讨论】:

我已经更新了我的 GitHub 存储库(请参阅“WorkAround”分支),它在 Picker 上使用递增的 .id() 并标记每个元素,这似乎是一个可行的解决方案(目前)。我仍然认为苹果应该解决这个问题。 在 Picker 上使用递增的 .id() 是一种不涉及两个选择器的解决方案。这是一个可行的解决方案,但我对 Apple 需要解决这个问题也有同样的看法。

以上是关于SwiftUI:添加元素时选择器内容未刷新的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 选择器分隔符

向 MongoDB 添加元素后视图未更新

SwiftUI - 日期选择器未正确显示

设置连续轮选择器 - SwiftUI

jquery使用选择器对该元素操作

粗谈伪类选择器