1

Listと呼ばれる整数配列から作成されたビューがdataあり、バインディングを使用してデータをビューに渡します。配列withAnimationに要素を追加するときに使用しています。data

以下に示すように のプロパティ ラッパーが である場合、data要素@Stateを追加するときにアニメーションが正しく再生されます。

struct MyApp: App {
    @State var data: [Int] = Array(1...5)
    
    var body: some Scene {
        WindowGroup {
            ContentView(data: $data)
        }
    }
}

ただし、data配列を に準拠するクラスに配置するObservableObjectと、要素を追加するときにアニメーションがまったく再生されません。

class MyData: ObservableObject {
    @Published var data: [Int] = Array(1...5)
}

struct MyApp: App {
    @ObservedObject var data: MyData = MyData()
    
    var body: some Scene {
        WindowGroup {
            ContentView(data: $data.data)
        }
    }
}

質問

  1. 私のコードは正しいですか?それともSwiftUIのバグですか?
  2. 2 番目の状況では、を使用して配列に追加するときにアニメーションを正しく表示するにはどうすればよいObservableObjectですか?

ContentView.swift

struct ContentView: View {
    @Binding var data: [Int]
    
    var body: some View {
        List {
            Button {
                withAnimation {
                    data.append(data.count + 1)
                }
            } label: {
                Text("Append an Item")
            }
            ForEach(data, id: \.self) { number in
                Text(String(number))
            }
        }
    }
}
4

1 に答える 1