当观察到的对象在 SwiftUI 中发生变化时,如何禁用列表中的动画?

0rt*_*0rt 18 ios swiftui

视图模型数据更改时如何禁用动画?

我有以下代码:

struct FormView: View {

    @ObservedObject var viewModel: FormViewModel

    var body: some View {
        List {
            ForEach(viewModel.options) { option in
                Text(option.displayValue)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次视图模型更改时List都会使用动画进行更新。
我怎样才能禁用它?
我尝试添加.animation(nil)但它没有帮助

Bur*_*dev 9

我找到的解决方案是添加一个每次都会改变的唯一标识符,这样它每次都会在没有动画的情况下重建列表。在 iOS 13.4 上验证。

var body: some View {
    List {
        ForEach(viewModel.options) { option in
            Text(option.displayValue)
        }
    }
    .id(UUID()) // no animation
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,“.animation(nil)”对我有用。有一个奇怪的错误会发生,比如抛出异常。 (3认同)
  • @StephenLee 的答案是更好的答案。使用 .id(UUID()) 可以防止 SwiftUI 计算视图的增量,从而导致在某些内容发生变化时重新绘制所有内容。 (2认同)

小智 5

我认为最好的解决方案是将 UUID() 设置为动画值输入:

        .animation(nil, value: UUID())
Run Code Online (Sandbox Code Playgroud)


use*_*734 2

Apple 给我们一个更改以在 List 上执行此操作之前的解决方法是调用 List.id(_:) 它会更改 List 的内部状态并强制 List 立即重新创建,而不需要任何动画。有关详细信息,请参阅列表重新加载动画故障

可以在任何 View 上执行相同的操作(func id() 是 View 协议的一部分),但您必须知道所有状态变量都将具有初始“默认”状态,因此请谨慎使用。这与“重新创建”视图相同。

要了解其工作原理,请参阅https://swiftui-lab.com/swiftui-id/