ScrollView 中的 ForEach 直到交互才更新

Posted

技术标签:

【中文标题】ScrollView 中的 ForEach 直到交互才更新【英文标题】:ForEach in ScrollView not updating until interaction 【发布时间】:2021-02-16 19:49:58 【问题描述】:

向数组添加或从数组中删除时,除非用户与ScrollView 交互,否则视图不会更新。

Model 是一个ObservableObject,在应用生命周期的早期被声明为StateObject,然后作为EnvironmentObject 传递。

数据只是一个带有对象数组的自定义Profile对象,当添加到store.profile!.tasks.append()或从视图中删除时,除非用户滚动ScrollView,否则不会更新;我的意思是字面意思是 1 个像素。

我尝试过的

将 ForEach 包装在 LazyVStack 或 VStack 中 将 NavigationLink 包装在 VStack 中 确保尺寸为全高,以防需要重新计算

代码

class Profile: Identifiable, Codable, Equatable
    var tasks: [Task]



struct Task: Identifiable, Codable, Equatable 
    var createdBy: String
    var title: String
    var date: Date


class Store : ObservableObject 
    @Published var profile: Profile?


struct ListView: View 

@EnvironmentObject var store: Store

  var body: some View 
     GeometryReader  geometry in
        ZStack(alignment: .bottomTrailing) 
          ScrollView(.vertical, showsIndicators: false)
              ForEach(store.profile!.tasks.filter( return $0.createdBy == store.profile!.uid).indices, id: \.self)  index in
                 NavigationLink(destination: DetailView().environmentObject(store)) 
                      TasksRow().id(UUID()) 
                 
             
          
           .frame(maxWidth: geometry.size.width, alignment: .center)
           .frame(maxHeight: geometry.size.height)
           .background(Color.gray)
       
    
 

【问题讨论】:

【参考方案1】:

您的Profile 是引用类型,因此当您在其中附加任务时,对配置文件的引用不会更改,因此已发布不起作用。

对配置文件使用值类型(即struct

struct Profile: Identifiable, Codable, Equatable
    var tasks: [Task]

现在将任务附加到配置文件将更改配置文件本身,发布者发送事件和视图将刷新。

【讨论】:

以上是关于ScrollView 中的 ForEach 直到交互才更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 List 而不是 ScrollView 和 ForEach

水平 ScrollView (SwiftUI) 中的动画展开/折叠组

ForEach 循环中的 SwiftUI 崩溃

如何使 scrollView 滚动 ImageView 直到中心?

ForEach 循环中的 VStack 不尊重 WatchOS 中的对齐参数

在 foreach 中等待几个可观察的 rxjs 直到完成执行另一个