SwiftUI:Picker中的ForEach不会更新

时间:2019-11-17 18:49:14

标签: ios swiftui

我有一个元素数组,我想使用Picker从中选择一个元素,还有一个Button,它只是向该数组中添加了一个新元素。问题是,当我添加元素时,Picker选项不会更新。它不适用于DefaultPickerStyle,但适用于SegmentedPickerStyle

代码:

import SwiftUI

struct ExampleView: View {
    @State
    var array : Array<Int> = [Int]()
    @State
    var selection : Int = 0

    var body: some View {
        VStack {
            Picker("", selection: self.$selection) {
                ForEach(self.array, id : \.self) { i in
                    Text(String(i))
                }
            }
            // uncomment, and picker will refresh upon pushing the button
            //.pickerStyle(SegmentedPickerStyle())

            Button(action: {
                self.array.append(self.array.count)
            }){
                Text("Add me: " + String(self.array.count))
            }
        }
    }
}

struct ExampleView_Previews: PreviewProvider {
    static var previews: some View {
        ExampleView()
    }
}

有什么办法可以解决这个问题?我真的需要更新Picker(以其默认样式)。 Xcode版本11.2.1(11B500)。

1 个答案:

答案 0 :(得分:1)

正如@ e-coms所指出的,有一个similar question@p-entgithub)发现的一种可接受的解决方法是在每次按下按钮时为.id(...)重新分配一个唯一的Picker,以强制进行更新。适应了我的问题:

UPD:更好,谢谢@ e-coms

import SwiftUI

struct ExampleView: View {
    @State
    var array : Array<Int> = [0,1,2]
    @State
    var selection : Int = 0

    var body: some View {
        VStack {
            Picker("", selection: self.$selection) {
                ForEach(self.array, id : \.self) { i in
                    Text(String(i))
                }
            }
            .id(self.array)

            Button(action: {
                self.array.append(self.array.count)
            }){
                Text("Add me: " + String(self.array.count))
            }
        }
    }
}

struct ExampleView_Previews: PreviewProvider {
    static var previews: some View {
        ExampleView()
    }
}