collectionView: reloadData работает, reloadItemsAtIndexPaths не работает

у меня есть UICollectionView чьи исходные данные иногда меняются за кадром. Чтобы обновить его, когда он вернется, я написал в CollectionViewController:

override func viewWillAppear(animated: Bool) {
    self.collectionView!.reloadData()
}

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

override func viewWillAppear(animated: Bool) {
    self.collectionView!.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
}

...но когда я это делаю, Xcode дает мне сообщение об ошибке:

операнд постфикс '!'должен иметь необязательный тип, удалить '!'".

когда я удалить '!- здесь сказано, что UICollectionView не имеет элемент с именем reloadItemsAtIndexPaths. Что я делаю не так?

4 ответов


из вашего кода похоже, что вы объявили свой collectionView как необязательный (с ?) в конце и, возможно, связал его с вашей раскадровкой с помощью @IBOutlet. Чтобы исправить вашу проблему, вы должны удалить ? от :

@IBOutlet var collectionView: UICollectionView?

и заменить его:

@IBOutlet var collectionView: UICollectionView!

таким образом, вы говорите компилятору, что ваш collectionView определенно существует (потому что вы связали его с раскадровкой).

в качестве альтернативы, вы можете связать свой collectionView, сделав это:

if let collectionView = collectionView {
    collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
}

Swift 3 код версии

var indexPaths = [IndexPath]()
indexPaths.append(indexPath) //"indexPath" ideally get when tap didSelectItemAt or through long press gesture recogniser.
collectionView.reloadItems(at: indexPaths)

Swift 4 обновить все элементы в разделе

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    var indexPaths: [NSIndexPath] = []
    for i in 0..<collectionView!.numberOfItems(inSection: 0) {
        indexPaths.append(NSIndexPath(item: i, section: 0))
    }
    collectionView?.reloadItems(at: indexPaths as [IndexPath])
}

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

for index in indexPaths {
            if index == [0, 0] {
                print(index)
                self.collectionView?.reloadItems(at: [index])
            }
        }

надеюсь, что это помогает.