1

我有一个UIViewControllerUICollectionView4 个自定义单元格的。在其中一个单元格中,我有一个 UIButton,当点击它时需要访问另一个单元格,以更新UIImage. 如何引用collectionViewUIViewController 中的引用以将其传递给其他 NIB?

//CollectionView
@IBOutlet weak var collectionView: UICollectionView!

override func awakeFromNib()为了引用其他单元格,我是否在其中放了一些东西?

例子:

let myCell = collectionView!.cellForItem(at: myIndexPath) as! MainCollectionViewCell

如何collectionView从其他 NIB 中引用?

谢谢

4

1 回答 1

0

从架构的角度来看,答案是“你不知道”。

正确的答案是拥有一个 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()
}
于 2017-10-13T01:31:00.313 回答