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())。
备注:内容仅供参考。
