Всегда предполагайте, что если ячейка находится вне экрана, то представление сбора уже переработало ее.Представление коллекции постоянно делает это, чтобы поддерживать низкое использование памяти и высокую производительность.
Для выполнения некоторых действий вне экрана я часто держу отдельный объект (модель представления в MVVM), к которому видимая ячейка может присоединиться,Этот объект принадлежит и хранится моими объектами и никогда не используется повторно.Если мне нужно выполнить какое-либо закадровое действие, этот объект сделает это.
Единственными заданиями ячейки являются:
- для отображения данных и
- для получения ввода пользователя
Оба требуют, чтобы он был видимым.
Когда я создаю ячейки, я использую prepareForReuse
, чтобы отделить его от предыдущей модели представления, и выполняю необходимую очистку, прежде чем прикрепить ячейку кследующий.
Альтернативное решение
Если все, что вам нужно, это путь индекса для получения вашего специального объекта, вы можете просто использовать путь индекса из атрибутов макета.
protocol MyCellDelegate: class {
func object(for indexPath: IndexPath) -> Object
}
class MyCell: UICollectionViewCell {
weak var delegate: MyCellDelegate?
override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
super.apply(layoutAttributes)
let obj = self.delegate?.object(for: layoutAttributes.indexPath)
// configure various subviews with obj ...
}
}