SwiftUI: содержимое средства выбора не обновляется при добавлении элемента - PullRequest
1 голос
/ 01 ноября 2019

У меня есть элемент Picker в VStack, но когда его содержимое изменяется при добавлении нового элемента, 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)")
        }
    }
}

Заранее благодарим за любую помощь!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

У меня есть репозиторий GitHub с этой проблемой. Я не думаю, что наличие двух сборщиков является жизнеспособным решением.

Ошибка обновления сборщика GitHub Repo

0 голосов
/ 02 ноября 2019

Вот трюк с реактивностью и всегда используйте две копии одной и той же вещи, когда вам нужно что-то обновить.

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

}

...