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 的 bug?
  2. 在第二种情况下,如何在使用附加到数组时正确显示动画ObservableObject

内容视图.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

0

尝试以下代码:

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

struct TestView: View {
    
    @StateObject
    var vm = TestViewModel()
    
    var body: some View {
        List {
            Button {
                withAnimation {
                    vm.data.append(vm.data.count + 1)
                }
            } label: {
                Text("Append an Item")
            }
            ForEach(vm.data, id: \.self) { number in
                Text(String(number))
            }
        }
    }
}
于 2021-10-16T17:12:15.557 回答