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?
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)
}
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])
}
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)
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 :)
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.