从架构的角度来看,答案是“你不知道”。
正确的答案是拥有一个 Model 类,它可能具有代表模型不同部分的属性。当用户点击按钮时,它会以某种方式影响模型(按钮操作应该调用模型对象上的方法。方法的名称对应用程序的用户来说是有意义的。)
当模型改变状态时,它应该通知任何观察者。查看观察者模式,但基本上,它就像一个代表数组。
应设置具有 UIImage 的单元以观察模型并对模型中的变化做出反应,在这种情况下,这恰好是由于按钮点击造成的,但也可能通过其他方式发生。
首先你需要一个模型类:
class MyModel {
typealias Observer = (MyModel) -> Void
func add(observer: @escaping Observer) {
observers.append(observer)
}
func updateImage() {
// do what you need to do to update `myImage`
// then call:
update()
}
private (set) var image: UIImage?
private var observers = [Observer]()
private func update() {
for each in observers {
each(self)
}
}
}
然后在您的视图控制器中创建此模型的实例:
let model = MyModel()
现在将视图控制器的模型传递给cellForItemAt
方法内的每个单元。
cell.model = model
在包含图像的单元格中,给它一个模型属性,如下所示:
var model: MyModel! {
didSet {
model.add(observer: { [weak self] updated in
self?.imageView.image = updated.image
})
}
}
具有按钮的单元格将具有正常的模型属性,并且在按钮的 IBAction 中,您将调用model.updateImage()
.
var model: MyModel!
@IBAction func buttonTapped(_ sender: Any) {
model.updateImage()
}