Как ссылаться на UICollectionView из других пользовательских UICollectionViewCells

У меня есть UIViewController это имеет UICollectionView с 4 пользовательскими ячейками. В одной из ячеек у меня есть UIB-кнопка, при нажатии которой требуется доступ к другой ячейке, чтобы обновить UIImage, Как мне сослаться на collectionView ссылка в моем UIViewController, чтобы передать его другим NIB?

//CollectionView
@IBOutlet weak var collectionView: UICollectionView!

Я положил что-то в мой override func awakeFromNib() для того, чтобы ссылаться на другие ячейки?

Пример:

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

Как мне ссылаться collectionView из других NIB?

Спасибо

1 ответ

С архитектурной точки зрения ответ - "нет".

Правильный ответ - иметь класс Model, возможно, со свойствами, которые представляют разные части модели. Когда пользователь нажимает кнопку, это каким-то образом влияет на модель (действие кнопки должно вызывать метод объекта модели. Имя метода будет иметь смысл для пользователя приложения.)

Когда модель меняет состояние, она должна уведомить любых наблюдателей. Посмотрите шаблон Observer, но в основном он похож на массив делегатов.

Ячейка с 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()
}
Другие вопросы по тегам