1

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 は構造体配列も子として含む構造体配列を使用しました。構造体配列を子として持っていない場合は、正常に動作します。

誰かが私にこれに対する良い解決策を提案できますか?

ありがとう。

4

1 に答える 1