UICollectionView не обновляется с помощью пользовательского UIViewController

Я создал собственный UIViewController и расширил его для реализации: UICollectionViewDataSource, UICollectionViewDelegate. В раскадровке я добавил UICollectionView и сделал ссылку из моего контроллера на этот UICollectionView (и настроил делегатов для источника данных и делегата представления коллекции).

Очевидно, я реализовал минимальные требования для этих двух делегатов. Теперь, поскольку я иногда асинхронно загружаю изображения, я вызываю методы cell.setNeedsLayout(), cell.layoutIfNeeded(), cell.setNeedsDisplay() после загрузки изображения (cell.imageView.image = UIImage(...)). Я знаю, что все эти методы называются. Однако изображения на экране не обновлялись.

Я что-то пропустил? Спасибо!

Изменить: добавить пример кода - как было вызвано обновление -

    func collectionView(collectionView: UICollectionView,
    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell
    ....

    let cellImage = ServiceFacade.sharedInstance.getImageFromCaching(image!.url)
    if cellImage == nil {
        // set image to default image.
        cell.cellImage.image = UIImage(named: "dummy")

        ServiceFacade.sharedInstance.getImage(image!.url, completion: { (dImage, dError) in
            if dError != nil {
               ...
            }
            else if dImage != nil {
                dispatch_async(dispatch_get_main_queue(),{


                    let thisCell = self.collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell
                    thisCell.cellImage.image = dImage
                    thisCell.setNeedsLayout()
                    thisCell.setNeedsDisplay()
                    thisCell.layoutIfNeeded()
                })

            }
            else{
                // do nothing
            }
        })
    }
    else {
        cell.cellImage.image = cellImage!
        cell.setNeedsDisplay()
    }

    // Configure the cell
    return cell

}

person BSharer App - Share Books    schedule 29.03.2016    source источник
comment
Вы устанавливаете образ после загрузки на основной поток? Ячейка может быть нулевой, когда загрузка завершена. Если вы можете опубликовать часть кода при загрузке и установке изображения   -  person Yan    schedule 30.03.2016
comment
Ян, спасибо, что изучил это для меня. Вот код, который я использовал для вызова обновления ячейки. Но это не сработало.   -  person BSharer App - Share Books    schedule 30.03.2016


Ответы (1)


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

Процедура, которую вы должны вызывать, чтобы указать, что вашу ячейку необходимо обновить, изменить размер и переделать ее визуальное представление, - это reloadItemsAtIndexPaths с одним индексным путем, представляющим вашу ячейку.

person Scott Thompson    schedule 30.03.2016