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呈现出不同输入行为

如何从结构视图数组中提取状态? SwiftUI

键盘在 SwiftUI 视图中始终位于顶部

SwiftUI Picker 在同一视图中更改第二个状态变量

如何在 SwiftUI 的 ForEach 循环中增加状态?