web-dev-qa-db-fra.com

collectionView: reloadData fonctionne, reloadItemsAtIndexPaths ne fonctionne pas

J'ai une UICollectionView dont les données source changent parfois lorsqu'elles sont hors écran. Pour le mettre à jour à son retour, j'ai écrit dans la CollectionViewController:

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

... et cela fonctionne, mais je n'ai jamais besoin de mettre à jour plus d'une ou deux cellules de ma UICollectionView; j'ai donc pensé qu'il serait préférable de remplacer la version ci-dessus par: 

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

... mais quand je le fais, Xcode me donne une erreur en disant:

Opérande de postfix '!' devrait avoir le type optionnel, supprimer '!' ".

Lorsque je supprime le "!", Il est indiqué que UICollectionView n'a pas de membre nommé reloadItemsAtIndexPaths. Qu'est-ce que je fais mal?

10
Le Toucan Sale

D'après votre code, il semblerait que vous ayez déclaré votre collection comme facultative (avec?) À la fin et que vous l'ayez peut-être liée à votre story-board à l'aide d'un @IBOutlet. Pour résoudre votre problème, vous devez supprimer le? du :

@IBOutlet var collectionView: UICollectionView?

et le remplacer par:

@IBOutlet var collectionView: UICollectionView! 

de cette façon, vous dites au compilateur que votre collectionView existe définitivement (car vous l'avez liée à partir de votre storyboard).

Vous pouvez également lier votre collectionView en procédant comme suit: 

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

Swift 4 recharger tous les éléments de la section 

 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])
}
5
Vac

Code de version de Swift 3

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

en tant que débutant, je ne savais pas qu'il y avait une différence lorsque vous implémentiez une collectionView en tant qu'enfant direct depuis un autre viewController et que vous l'implémentiez en tant que vue intégrée dans un viewController, peut-être qu'un développeur est confronté au même problème et qu'il ne le sait pas, Si oui, cherchez la bonne approche :)

0
karique

Si vous souhaitez recharger une seule cellule, vous pouvez spécifier le type de cellule comme suit: -

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

J'espère que cela t'aides.

0
Nizzam