You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何更新循环视图?ViewModel数据变更时重载内容

问题解决方法

你的代码里有两处调整点,改完就能让数组变更时自动刷新循环内容:

  1. 删掉多余的手动事件发送
    你的ViewModel里data已经用@Published修饰了,数组内容变更时,SwiftUI会自动收到更新通知,完全不需要手动调用dateTimeSelectionModel.objectWillChange.send(),直接把这行代码删掉就行。

  2. 修正ForEach的遍历方式
    用0..<dateTimeSelectionModel.data.count这种范围遍历的写法,SwiftUI有时没法精准感知数组元素数量的变化。换成直接遍历数组元素(或带索引的绑定方式)更可靠:

修正后的视图代码

import SwiftUI
struct DateTimeSelectionView: View {
    @ObservedObject private var dateTimeSelectionModel = DateTimeSelectionViewModel()
    var body: some View {
        VStack {
            Button {
                self.dateTimeSelectionModel.updateRecord()
            } label: {
                Text("Update Record")
            }
            
            // 方式1:直接遍历数组元素
            ForEach(dateTimeSelectionModel.data, id: \.self) { item in
                VStack {
                    Text("Hello \(item)")
                }
            }
            
            // 如果需要用到索引,用下面这种写法
            // ForEach(Array(dateTimeSelectionModel.data.enumerated()), id: \.element) { index, item in
            //     VStack {
            //         Text("Hello \(index)")
            //     }
            // }
        }
    }
}

struct DateTimeSelectionView_Previews: PreviewProvider {
    static var previews: some View {
        DateTimeSelectionView()
    }
}

调整原因说明

  • @Published属性本身会在值变更时自动向SwiftUI发送更新信号,手动调用事件属于冗余操作,甚至可能引发不必要的重复刷新。
  • ForEach使用数组元素(配合id: \.self)时,SwiftUI能通过元素的唯一标识追踪子视图的增删,确保数组变化时精准更新对应的内容。

内容的提问来源于stack exchange,提问作者Arnav Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:17:20