解决:将ForEach中需要监听变化的View提成新的struct
不废话,直接上代码
struct ContenView: View {
@State var list = [
CellData(isClosed: true),
CellData(isClosed: false)
]
var body: some View {
VStack {
// 这里想显示多个按钮,点击按钮的时候,对应变换按钮。
ForEach(list) { item in
Button {
item.isClosed.toggle()
} label: {
Image(systemName: item.isClosed ? "mic" : "mic.fill")
.resizable()
.scaledToFit()
}
}
}
}
}
CellData如下:
class CellData: Identifiable, ObservableObject {
var id = UUID()
@Published var isClosed: Bool
init( isClosed: Bool) {
self.isClosed = isClosed
}
}
运行发现,点击按钮,body没有被刷新
一开始以为是 @State
的原因,尝试将 Array 包在一个新的class中, 使用 @StateObject
或 @ObservedObject
,均无法刷新。
先说解决方法:
将ForEach中需要监听变化的View提成新的struct
struct Cell : View {
@StateObject var item : CellData
var body: some View {
Button {
item.isClosed.toggle()
} label: {
Image(systemName: item.isClosed ? "mic" : "mic.fill")
.resizable()
.scaledToFit()
}
}
}
原先 ContentView
改为
struct ContentView: View {
@State var list = [
CellData(isClosed: true),
CellData(isClosed: false)
]
var body: some View {
VStack {
ForEach(list) { item in
Cell(item: item)
}
}
}
}
原因和思考过程,下次写咯~
网友评论