SwiftUI - 如何在修改来自同一结构的状态变量时避免刷新列表
Posted
技术标签:
【中文标题】SwiftUI - 如何在修改来自同一结构的状态变量时避免刷新列表【英文标题】:SwiftUI - How to avoid to refresh a List when a state var from the same struct is modified 【发布时间】:2020-02-11 11:11:17 【问题描述】:我有一个主视图,其中包含一个带有 TabView 的主体,每个选项卡显示一个不同的列表。另外,我在主类的顶部声明了一个状态变量,仅用于控制是否必须显示类似模式的视图。
问题在于,当我更改该状态变量的值时,主视图的所有主体都会用动画重绘。这不是理想的行为,因为我没有更改与更新该 var 的列表关联的数据。
struct HomeView: View
@State private var selection = 0
@State var modalShown = false //This is the problematic var that makes a list to be updated with an animation
@EnvironmentObject var filters: UserFilters
@EnvironmentObject var filtersViewController: FiltersViewController
init()
UITabBar.appearance().backgroundColor = #colorLiteral(red: 0.03921568627, green: 0.03921568627, blue: 0.03921568627, alpha: 1)
UITabBar.appearance().barTintColor = #colorLiteral(red: 0.03921568627, green: 0.03921568627, blue: 0.03921568627, alpha: 1)
var body: some View
return ZStack
TabView(selection: $selection)
IncidencesView(modalShown: $modalShown) //A view that contains a list that is being refreshing
至少,有没有办法避免列表更新动画?
谢谢!
【问题讨论】:
【参考方案1】:至少,有没有办法避免列表更新动画?
提供的代码快照不可测试,所以只是在运行中...尝试以下操作
IncidencesView(modalShown: $modalShown.animation(nil))
【讨论】:
【参考方案2】:试试这个。
发表你的看法,我相信在这种情况下IncidencesView
,符合Equatable
。
这将要求您重载 == 运算符,并准确告诉 SwiftUI 在什么情况下视图发生了变化以及何时没有发生变化。
一旦你这样做了,在 HomeView
修改 IncidencesView
和 .equitable()
视图修饰符,告诉它的父 HomeView
检查 IncidencesView
是否仍然等于它的旧自我,当有一个变化时状态。如果还是和原来的自己一样,就不要重绘了。
现在即使selection
发生变化,SwiftUI 也会检查当前的IncidencesView
是否仍然等于新条件下的版本。它会看到它是(因为selection
可能不会影响 == 函数的结果),因此不会重新创建和绘制新版本的视图。
查看这篇精彩的文章:https://swiftui-lab.com/equatableview/
【讨论】:
以上是关于SwiftUI - 如何在修改来自同一结构的状态变量时避免刷新列表的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为
SwiftUI如何让绑定到同一个状态的多个TextField呈现出不同输入行为