У меня есть ячейка collectionView со свойством isExpanded: Bool
.Когда ячейка загружается впервые, она установлена на false
и показывает только 1 строку текста.Если текст длиной в несколько строк, я добавляю «еще ...» в конец первой строки, а если нажата метка, я расширяю ячейку.Это работает, но мне нужно дважды нажать метку, чтобы развернуть ячейку, а затем дважды, чтобы свернуть ячейку обратно на 1 строку.
Я пришел к выводу, что при первом нажатии метки я проверяючтобы увидеть, если isExpanded == false
, и если это так, я установил его на true
, затем передал index.item ячейки обратно в протокол и вызвал performBatchUpdates
, а затем collectionView.reloadItems(at:)
.
После запуска я проверяюisExpanded
и вместо true
это false
, поэтому ячейка не расширяется.Если я снова нажму метку, теперь все будет работать так, как предполагалось, и isExpanded is true
и ячейка расширяется.
Почему свойство isExpanded
устанавливается на false
при первом обходе, дажехотя я установил для него значение true, но на втором обороте он остается установленным в значение true?
Для большей ясности
isExpanded
изначально false
- метка нажата и
isExpanded
устанавливается на true
- после
performBatchUpdates
и reloadItems(at:)
запускается isExpanded
каким-то образом возвращается на false
( это проблема) - после повторного нажатия метки
isExpanded
устанавливается на true
- после
performBatchUpdates
и reloadItems(at:)
запускается еще раз isExpanded
равно true
( это то, что должно произойти на 3-м шаге ).
Это должен быть трехэтапный процесс, но это всегда пятиэтапный процесс.
При свертыванииячейка происходит то же самое, и мне нужно дважды нажать на ярлык, чтобы он рухнул.
Класс ячейки
protocol: MyCellDelegate: class {
func expandOrCollapseCell(indexItem: Int)
}
weak var delegate: MyCellDelegate?
var indexItem: Int = 0
var isExpanded = false
var review: Review? {
didSet {
if let review = review else { return }
// run logic to expand or collapse cell depending on wether isExpanded is true or false
}
}
func tapGestureForLabel() {
if !isExpanded {
isExpanded = true
} else {
isExpanded = false
}
delegate?.expandOrCollapseCell(indexItem: self.indexItem)
}
И внутри класса сCollectionView
func expandOrCollapseCell(indexItem: Int) {
let indexPath = IndexPath(item: indexItem, section: 0)
UIView.animate(withDuration: 0) {
self.collectionView.performBatchUpdates({ [weak self] in
self?.collectionView.reloadItems(at: [indexPath])
self?.collectionView.layoutIfNeeded()
}) { (_) in
print("finished updating cell")
}
}
}
Я попытался передать isExpanded
в протоколе (я удалил его) и внутри класса с помощью CollectionView. Я обновил свойство isExpanded
ячейки, как это, но это не имело никакого значения
func expandOrCollapseCell(indexItem: Int, isExpanded: Bool) {
if let cell = self.collectionView.cellForItem(at: indexPath) as? MyCell {
cell.isExpanded = isCellExpanded
}
// perform batchUpdates ...
}