PAYATHON 2026

SwiftUI Table 为什么在更新动态数组后没有刷新?

数据小许

点击按钮后表格没有刷新,是因为按钮闭包中的 let ADGroupsArray 声明了一个局部变量,遮蔽了视图里的同名 @State 属性。Table 读取的状态数组没有改变,所以仍然显示原来的数据。将新数组直接赋值给 self.ADGroupsArray 即可。

为什么当前代码没有更新表格?

表格的数据源是这个属性:

@State private var ADGroupsArray = [User(USERADgroup: "qqq ")]

按钮中则重新声明了一个变量:

let ADGroupsArray: [User] = finArray.map { USERADgroup in
    User(USERADgroup: USERADgroup)
}

这个局部数组只存在于按钮闭包中,没有写回 @State。即使 userGroupString 的变化触发了视图更新,Table 读取的仍然是原来的 ADGroupsArray。

如何修改?

移除局部变量声明,将转换结果赋值给状态属性。这里用 self.ADGroupsArray 明确指定要修改的属性:

self.ADGroupsArray = finArray.map { group in
    User(USERADgroup: group)
}

完整示例如下:

import SwiftUI
import Foundation

struct User: Identifiable {
    let id = UUID()
    let USERADgroup: String
}

struct ContentView: View {
    @State private var userGroupString: String = ""
    @State private var ADGroupsArray = [
        User(USERADgroup: "qqq ")
    ]

    var body: some View {
        VStack {
            Table(ADGroupsArray) {
                TableColumn("User Groups", value: \.USERADgroup)
            }

            // my button
            Button("Button") {
                userGroupString = "Group1, Group2, Group3"

                let finArray = userGroupString.components(
                    separatedBy: ", "
                )

                self.ADGroupsArray = finArray.map { group in
                    User(USERADgroup: group)
                }
            }
            .padding()
            .frame(width: 400.0, height: 400.0)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在支持该 Table 用法的项目中,点击按钮后,状态数组会被替换为包含 Group1、Group2、Group3 的数组,SwiftUI 会据此更新表格,无需手动调用刷新方法。

还需要注意什么?

原代码中的 /my button 不是合法的 Swift 注释。如果实际代码也是这样,需要改成 // my button,否则会出现编译错误。

components(separatedBy: ", ") 按逗号加一个空格分隔,适用于示例中的字符串。如果实际输入是 Group1,Group2,Group3,则需要按逗号分隔,并根据需要清理各项两端的空白。

User 已通过 Identifiable 提供行标识。这次故障是因为状态数组没有被赋值,无需为了刷新表格额外添加 .id(UUID())。

备注:内容仅供参考。