Я занимаюсь разработкой моего тестового приложения SwiftUI и у меня возникли проблемы с @Published и @ ObservedObject.
Вот мой код (к вашему сведению, я удалил несколько строк кода и добавил несколько фиктивных значений, чтобы вы могли легко их понять)
import SwiftUI
struct S0: Identifiable {
var id = UUID()
var arr: [S1] = []
}
struct S1: Identifiable {
var i: Int
var id = UUID()
}
class Model: ObservableObject {
@Published var items: [S0] = [S0(arr: [S1(i: 100)])]
}
struct ContentView: View {
@ObservedObject var testModel = Model()
@State var flag = false
var body: some View {
VStack {
List {
ForEach (self.testModel.items){ item in
Text("\(item.arr.last?.i.description ?? "nil")")
}
}
Button(action: {
self.flag.toggle()
}) {
Text("Add")
}.sheet(isPresented: $flag) {
ModalView(flag: self.$flag).environmentObject(self.testModel)
}
}
}
}
struct ModalView: View {
@Binding var flag: Bool
@EnvironmentObject var testModel: Model
var body: some View {
Button(action: {
if let lastItem = self.testModel.items.last {
var newItem = lastItem
newItem.arr[0].i += 100
self.testModel.items.append(newItem)
}
self.flag.toggle()
}) {
Text("add")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Проблема в том, что когда я добавляю кнопку «Добавить», должны отображаться разные цифры (+100 к предыдущему номеру), но при этом отображаются одинаковые цифры (100)
Как видно из моего кода @Published использовал struct array, который также содержит struct array в качестве дочернего элемента. Если у меня нет дочернего массива struct array, он работает нормально.
Может кто-нибудь предложить мне хорошее решение для этого?
Спасибо.