Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI:添加元素时未刷新选取器内容_Swiftui_Picker - Fatal编程技术网

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

SwiftUI:添加元素时未刷新选取器内容,swiftui,picker,Swiftui,Picker,我在VStack中有一个Picker元素,但是当它的内容通过添加新元素而改变时,Picker不会刷新 隐藏并显示选择器后,新元素可见 有没有人知道如何在不需要隐藏/显示的情况下刷新选择器的内容 您可以通过创建一个新的SwiftUI项目并复制以下代码而不是“ContentView”结构来复制它 提前感谢您的帮助 这里有一个技巧:反应式,当你需要刷新某些东西时,总是使用同一东西的两个副本 class ContentModel{ @Published var pickerData: [String

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

隐藏并显示选择器后,新元素可见

有没有人知道如何在不需要隐藏/显示的情况下刷新选择器的内容

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


提前感谢您的帮助

这里有一个技巧:反应式,当你需要刷新某些东西时,总是使用同一东西的两个副本

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

}

我有一份GitHub回购协议,涉及此问题。我不认为有两个采摘者是一个可行的解决方案


以下情况不起作用:我的车轮捡拾器也有类似问题,但仍未解决。那些SwiftUI bug真的很烦人:我已经更新了我的GitHub repo(参见“变通”分支),它在选择器上使用递增的.id()并标记每个元素,这似乎是一个可行的解决方案(目前)。我仍然认为苹果应该解决这个问题。在选择器上使用递增的.id()是一个不涉及两个选择器的解决方案。这是一个可行的解决方案,但对于苹果需要解决这个问题,我也有同样的看法。
 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)")
    }
}