Как использовать ObservedObject в качестве выбора в сборщике вместе с выбором по умолчанию в SwiftUI

#ios #swiftui #picker

#iOS #swiftui #сборщик

Вопрос:

Я хочу использовать класс Observed Object в качестве выбора для сборщика, который я пытаюсь реализовать. Параметры сборщика заполняются из массива объектов того же класса. Все работает нормально, пока я не попытаюсь установить выбор по умолчанию для сборщика на основе ранее сохраненных данных. Когда я устанавливаю для выбора свойство name, выбор по умолчанию устанавливается правильно, но тогда я не могу изменить выбор сборщика. Я могу щелкнуть по списку параметров, и значение по умолчанию выбрано правильно, но нажатие на любую другую опцию просто возвращает к форме, и выбор не изменяется.

Я относительно новичок в Swift и SwiftUI, поэтому, вероятно, есть что-то, что я неправильно понимаю, но любая помощь была бы очень признательна.

Вот класс и структура для объектов, которые я использую:

 struct DisciplineData: Codable, Hashable {
    var _id:String = ""
    var name:String = ""
    var isDefault:Bool = false
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(_id)
    }
}

class DisciplineDataModel: ObservableObject {
    @Published var data:DisciplineData = DisciplineData()
    var dataPresent:Bool {
        data.name.trimmingCharacters(in: .whitespaces).isEmpty ? false : true
    }
    
    func setDisciplineDataProperties(newData: DisciplineData) {
        self.data = newData
    }
    
    func getPropertiesAsDisciplineData() -> DisciplineData {
        let data:DisciplineData = DisciplineData()
        
        return data
    }
}
  

Вот версия сборщика, которая работает, но выбор по умолчанию не отображается:

 private struct DisciplineSectionView: View {
    @ObservedObject var discipline:DisciplineDataModel
    var disciplines: [DisciplineData] = []
    @Binding var disabled:Bool
    
    
    var body: some View {
        Section(header: Text("Discipline")) {
            Picker("Discipline:", selection: $discipline.data) {
                ForEach(disciplines, id:.self) { discipline in
                    Text(discipline.name)
                }
            }
            .disabled(disabled)
        }
    }
}
  

И вот версия сборщика, в которой отображается выбор по умолчанию, но

 private struct DisciplineSectionView: View {
    @ObservedObject var discipline:DisciplineDataModel
    var disciplines: [DisciplineData] = []
    @Binding var disabled:Bool
    
    
    var body: some View {
        Section(header: Text("Discipline")) {
            Picker("Discipline:", selection: $discipline.data.name) {
                ForEach(disciplines, id:.self.name) { discipline in
                    Text(discipline.name)
                }
            }
            .disabled(disabled)
        }
    }
}
  

Комментарии:

1. Неясно, как вы сохраняете / восстанавливаете данные по умолчанию DisciplineDataModel. Это должен быть один из выбранных массивов. Я думаю, что проблемы заключаются в том, что вы создаете новые DisciplineData() в модели. Вариант с именем выбора не подходит.

2. Спасибо! Вы были на 100% правы в том, что DisciplineData перезаписывались. Я выполнял вызов API для загрузки сохраненных данных в .onAppear, поэтому каждый раз, когда был сделан выбор сборщика, он возвращался к выбору по умолчанию, потому что вызов API будет выполнен снова. Я не знал, что сборщики функционируют таким образом, но это имеет смысл. Спасибо, что наставили меня на правильный путь!