SwiftUI: Array ForEach body不更新

解决:将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)
            }
        }
    }
}

原因和思考过程,下次写咯~

你可能感兴趣的:(SwiftUI: Array ForEach body不更新)