1

在我的SwiftUI项目中,我有一个按钮class模型:

import SwiftUI
import Combine

class Button: Identifiable, ObservableObject {
    
    var id = UUID()
    @Published var title = String()

    init(title: String) {
        self.title = title
    }
    
    func changeTitle(title: String) {
        self.title = title
    }
}

然后我有另一个class名称ControlPanel,它有一个 Button 数组作为参数。

class ControlPanel: Identifiable, ObservableObject {
    var id = UUID()
    @Published var name = String()
    @Published var buttons:[Button] = []
    
    init(name: String) {
        self.name = name
    }  
}

UIViewControllerRepresentable我必须在我用一个类构建的自定义集合视图中收听这个数组:

struct ButtonCollectionView: UIViewControllerRepresentable {
    @Binding var buttons: [Button]
    
    func makeUIViewController(context: Context) -> UICollectionViewController {
        let vc = CollectionViewController(collectionViewLayout: .init())
        vc.buttonArray = buttons
        return vc
    }
    
    func updateUIViewController(_ uiViewController: UICollectionViewController, context: Context) {
        if let vc = uiViewController as? CollectionViewController {
            vc.buttonArray = buttons
            vc.collectionView.reloadData()
        }
    }
}

最后,我在内容视图中调用此集合视图,方法如下:

@ObservedObject var controlPanel: ControlPanel = ControlPanel(name: "test")

var body: some View {
    ButtonCollectionView(button: $controlPanel.buttons)
}

当我加载我的内容视图时,我确实得到了所有单元格,但是一旦我更改它们,视图就不会更新。我该如何解决这个问题?

4

1 回答 1

0

Button已经在另一个@Published属性中,因此@Published var title无法使用。

最简单的解决方案是创建Button一个结构(并将其重命名为 SwiftUI 未使用的名称,例如。CustomButton):

struct CustomButton: Identifiable {
    var id = UUID()
    var title = ""
    
    mutating func changeTitle(title: String) {
        self.title = title
    }
}

有关更高级的解决方案,请参阅:如何告诉 SwiftUI 视图绑定到嵌套的 ObservableObjects

于 2020-09-02T16:09:32.467 回答