Как я могу получить SwiftUI для обнаружения изменений в словаре? - PullRequest
1 голос
/ 04 апреля 2020

Как я могу заставить SwiftUI определять, когда значения в Словаре меняются?

class DictModel: ObservableObject {
    @Published var dict: [String: [String: Int]] = [:]
}

Код SwiftUI

struct TestPublishedDidSet: View {
    @ObservedObject var vm = DictModel()

    var body: some View {
        VStack {
            Button("Assign") { self.vm.dict = ["Key1": ["Some value": 1]] }
            Button("Modify") { self.vm.dict["Key2"] = ["Some new value": 2] }
            Divider()
           ForEach(Array(self.vm.dict.keys), id: \.self) { key in
              VStack {
                 Text("\(key)")
                 ForEach(Array(self.vm.dict[key].keys), id: \.self) { key in
                    Text("\(key): \(self.vm.dict[key][key])")
                 }
              }
           }
        }
    }
}

Я предполагаю, что может потребоваться создать пользовательский Класс словаря, который отправляет и обновляет () сообщение, когда любое значение ключа добавляется или изменяется. Любая идея о том, как это будет сделано. Обратите внимание, что обновления выполняются фоновым потоком с использованием вызова DispatchQueue.main.async{}.

РЕДАКТИРОВАТЬ: - это действительно работает - я, должно быть, делал что-то еще неправильно.

1 Ответ

1 голос
/ 04 апреля 2020

Следующий пример работает, обновляет пользовательский интерфейс для обоих вариантов использования: назначить и изменить.

Протестировано с Xcode 11.4 / iOS 13.4

class DictModel: ObservableObject {
    @Published var dict: [String: String] = [:]
}

struct TestPublishedDidSet: View {
    @ObservedObject var vm = DictModel()

    var body: some View {
        VStack {
            Button("Assign") { self.vm.dict = ["Key1": "Some value"] }
            Button("Modify") { self.vm.dict["Key2"] = "Some new value" }
            Divider()
           ForEach(Array(self.vm.dict.keys), id: \.self) { key in
              Text("\(self.vm.dict[key]!)...")
           }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...