Swift -Property внутри ячейки collectionView не обновляется после выполнения collectionView.performBatchUpdates> reloadItems (at :) - PullRequest
1 голос
/ 18 апреля 2019

У меня есть ячейка 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?

Для большей ясности

  1. isExpanded изначально false
  2. метка нажата и isExpanded устанавливается на true
  3. после performBatchUpdates и reloadItems(at:) запускается isExpanded каким-то образом возвращается на false ( это проблема)
  4. после повторного нажатия метки isExpanded устанавливается на true
  5. после 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 ...
}

1 Ответ

1 голос
/ 18 апреля 2019

Это распространенная проблема, связанная с положением в ячейку, которая отключена для хранения состояния модели, например

var isExpanded = false // should be inside model of each cell

, вам необходимо добавить эти данные в модель ячейки и проверить их, когда вам нужноизмените состояние, затем выполните перезагрузку

...