Answers:
直到Apple给我们做出更改才能在List上进行更改的解决方法是调用List.id(_ :),它更改List的内部状态并强制List立即重新创建,而没有任何动画。有关详细信息,请参见列出重新加载动画故障。
可以在任何View上执行相同的操作(func id()是View协议的一部分),但是您必须知道所有状态变量都将具有初始的“默认”状态,因此请谨慎使用。就像“重新创建”视图一样。
为了能够了解其工作原理,请参阅https://swiftui-lab.com/swiftui-id/
我发现的解决方案是添加一个每次都会更改的唯一标识符,因此它将在没有动画的情况下每次都重新构建列表。在iOS 13.4上验证。
var body: some View {
List {
ForEach(viewModel.options) { option in
Text(option.displayValue)
}
}
.id(UUID()) // no animation
}
如果您不使用,则无需在List内使用ForEach Section
。所以代替:
List {
ForEach(viewModel.options) { option in
Text(option.displayValue)
})
}
以下代码足以编写:
List(viewModel.options) { option in
Text(option.displayValue)
}
而且最好知道使用ForEach会产生一些问题,例如:SwiftUI:是否可以使用ForEach + ContextMenu?
如果您只使用+ ForEach()
或仅使用List()
+ .animation(nil)
-必须解决您的问题:
范例1:
ForEach(viewModel.options) { option in
Text(option.displayValue)
}.animation(nil)
范例2:
List(viewModel.options) { option in
Text(option.displayValue)
}.animation(nil)
我已经在macOS 10.15.2(19C57)上进行了测试,并且工作正常。
你也可以尝试使用.animation(nil)
上List
和ForEach
两者。我没有尝试...但是我认为这也会给您带来所需的效果。
List {
ForEach(viewModel.options) { option in
Text(option.displayValue)
}.animation(nil)
}.animation(nil)
.animation(nil)
Xcode 11.4和iOS 13.4上进行了测试,它对我有用。
.animation(nil)
似乎有13.3没有影响,不幸的是