我有一个带有4个自定义单元格的UICollectionView
的UIViewController
。在其中一个单元格中,我有一个UIButton,当点击它时,需要访问另一个单元格,以更新UIImage
。如何在我的UIViewController中引用collectionView
引用以将其传递给其他NIB?
//CollectionView
@IBOutlet weak var collectionView: UICollectionView!
为了引用其他单元格,我需要在override func awakeFromNib()
中添加一些内容吗?
示例:
let myCell = collectionView!.cellForItem(at: myIndexPath) as! MainCollectionViewCell
如何从其他NIB引用collectionView
?
谢谢
发布于 2017-10-13 09:31:00
从架构的角度来看,答案是“不需要”。
正确的答案是有一个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()
}
https://stackoverflow.com/questions/46720757
复制相似问题