SwiftUI使用了值语义,即当数组的值发生更改时,SwiftUI无法检测到具体的更改操作。
要解决这个问题,可以使用SwiftUI中的@State属性包装器来创建一个可观察的状态变量。当数组发生更改时,通过更改状态变量的值来触发列表的更新,但是这种改变仅仅是指数组append一个结构体或remove一个结构体时,页面会增加或减少一个元素
以下场景UI不会更新:
结构体数组直接定义为View的一个@State属性,且结构体遵循了Hashable或Equatable协议并且实现了==静态函数来标识结构体的唯一性
当点击“修改结构体属性”时,页面1就改变了一次颜色,后面一直点击都不改变颜色,说明修改结体数组中某个结构体属性无法更新UI
解决办案:
方案一:去掉结构体的Hashable或Equatable或
static func == (lhs: SettingModel, rhs: SettingModel) -> Bool {
return lhs.id == rhs.id
}这个静态函数,去掉了就能更新UI
方案二:如果有些函数要求结构体必须遵循Hashable或Equatable协议,那就用另外一种方式,再单独定义一个Class类型的ViewModel,遵循ObservableObject协议,并将结构体数组定义为@Published类型,然后在View中定义@StateObject类型的viewModel,通过viewModel来引用结构体数组