#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 будет выполнен снова. Я не знал, что сборщики функционируют таким образом, но это имеет смысл. Спасибо, что наставили меня на правильный путь!