Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在没有动画的情况下更新SwiftUI列表_Ios_Swift_Swiftui - Fatal编程技术网

Ios 如何在没有动画的情况下更新SwiftUI列表

Ios 如何在没有动画的情况下更新SwiftUI列表,ios,swift,swiftui,Ios,Swift,Swiftui,我想在不插入任何动画的情况下更新SwiftUI列表。 我的列表正在从@EnvironmentObject 我已经尝试将列表本身和PassthroughSubject.send()包装在带动画(.empty)块中,但这没有帮助 一个非常肮脏的解决方法是调用UIView.setanimationEnabled(false)(是的,UIKit对SwiftUI有影响),但必须有一种类似于SwiftUI的方法来设置自定义插入动画 .animate(nil) 您可以找到更多关于此操作的信息,只需将.id(

我想在不插入任何动画的情况下更新SwiftUI列表。 我的
列表
正在从
@EnvironmentObject
我已经尝试将
列表本身和
PassthroughSubject.send()
包装在
带动画(.empty)
块中,但这没有帮助

一个非常肮脏的解决方法是调用
UIView.setanimationEnabled(false)
(是的,UIKit对SwiftUI有影响),但必须有一种类似于SwiftUI的方法来设置自定义插入动画

.animate(nil)

您可以找到更多关于此操作的信息,只需将
.id(UUID())
放在列表的末尾

List {
    // for each etc
}.id(UUID())

有点像为UIKit重新加载数据虽然DogCoffee提供的答案有效,但它的效率很低。有时,我们必须通过效率低下迫使系统做我们想做的事情。对于SwiftUI中的隐式动画,有更好的方法禁用它们

使用SwiftUI中的机制,我们可以定义一个可应用于任何视图的扩展。这将禁用视图和所有子视图的动画

对于列表视图示例,这样可以避免使用相同的新副本替换列表中的所有数据

extension View {
     
    func animationsDisabled() -> some View {
        return self.transaction { (tx: inout Transaction) in
            tx.disablesAnimations = true
            tx.animation = nil
        }.animation(nil)
    }
}
尝试将此扩展应用于列表或包含视图的父视图。你可能需要进行实验才能找到理想的视图

List {
    // for each etc
}.animationsDisabled()

问题是,如果此功能已经存在,但我找不到它。请共享代码好吗?恐怕设置。动画(nil)既不包含列表本身,也不包含列表中的项目,则在加载新项目并将其更新到列表时,会使“折叠”动画消失。这达到了预期效果,但。。。为什么?似乎每次更新时它都会重新绘制整个列表(因为ID总是在变化,因为每次都是新的UUID),所以这看起来很像黑客。SwiftUI通常会在当前列表和新列表之间进行区分,以确定插入和删除的行,但通过每次设置新的UUID,它认为自己有一个新列表,所以不必费心尝试进行区分。我使用:
list{…}.animation(nil)
。我使用的是Xcode 11.5