UIcollectionView странное поведение утилизации клеток - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть UICollectionView с макетом потока, около 140 ячеек с простым UITextView.Когда ячейка перерабатывается, я помещаю textView в кеш и снова использую его в новой ячейке.Все работает хорошо, пока я не достигну дна и не прокручиваю назад.В этот момент я вижу, что CollectionView реализует ячейку с номером 85, но затем перед отображением ячейки 85 она снова перерабатывает ее для ячейки 87, поэтому я теряю содержимое ячейки, которую я только что подготовил.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

   let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FormCell", for: indexPath) as! FormCollectionViewCell
   let textView = Cache.vendTextView()
   textView.text = "\(indexPath.row)"
   cell.addSubview(textView)
   cell.textView = textView

   return cell

}

И на UIcollectionViewCelC

override func prepareForReuse() {

   super.prepareForRuse()
   self.textView.removeFromSuperView()
   Cache.returnView(self.textView)

}

Я бы подумал, что после вызова cellForItemAtIndexPath () он будет удален из пула ячеек многократного использования, но кажется, что этонемедленно перерабатывается в соседнюю камеру.возможно ошибка или я, возможно, неправильно понимаю нормальное поведение UICollectionView?

enter image description here

1 Ответ

0 голосов
/ 12 февраля 2019

Насколько я понимаю, вы пытаетесь просто отслеживать содержимое ячейки - сохраняйте ее, когда ячейка исчезает, и восстанавливайте ее, когда она возвращается снова.То, что вы делаете, не может работать хорошо по нескольким причинам:

  1. vendTextView и returnView не принимают indexPath в качестве параметра - ваш кэш хранит что-то иизвлечение чего-либо, но у вас нет возможности узнать, что вы сохраняете / извлекаете это для правильной ячейки

  2. Нет смысла кэшировать весь текстовый просмотр - почему бы просто не кэшировать текст?

Попробуйте что-то подобное:

У вашего FormCollectionViewCell просто будет текстовое представление в качестве подпредставления, и измените свой код следующим образом:

class YourViewController : UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 
{
    var texts = [IndexPath : String]()

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FormCell", for: indexPath)
        if let formCell = cell as? FormCollectionViewCell {
            cell.textView.text = texts[indexPath]

            return cell
        }
    }

    func collectionView(_ collectionView: UICollectionView, 
        didEndDisplaying cell: UICollectionViewCell, 
               forItemAt indexPath: IndexPath)
    {
        if let formCell = cell as? FormCollectionViewCell {
        {
            texts[indexPath] = formCell.textView.text
        }
    }
}
...