it-swarm.com.de

collectionView: reloadData funktioniert, reloadItemsAtIndexPaths nicht

Ich habe eine UICollectionView, deren Quelldaten sich manchmal ändern, wenn sie außerhalb des Bildschirms liegen. Um es zu aktualisieren, wenn es zurückkehrt, schrieb ich in CollectionViewController:

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

... und das funktioniert, aber ich brauche nie mehr als ein oder zwei Zellen in meiner UICollectionView zu aktualisieren, also dachte ich, es wäre besser, wenn ich die obige Version durch Folgendes ersetze: 

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

... aber wenn ich das tue, gibt mir Xcode eine Fehlermeldung:

Operand von Postfix '!' sollte einen optionalen Typ haben, löschen Sie '!' ".

Wenn ich das '!' Lösche, heißt es, dass UICollectionView kein Mitglied mit dem Namen reloadItemsAtIndexPaths hat. Was mache ich falsch?

10
Le Toucan Sale

Es sieht so aus, als hätten Sie Ihre collectionView am Ende als optional (mit?) Deklariert und möglicherweise mit einem @IBOutlet mit Ihrem Storyboard verknüpft. Um Ihr Problem zu beheben, sollten Sie das entfernen? von dem :

@IBOutlet var collectionView: UICollectionView?

und ersetze es mit:

@IBOutlet var collectionView: UICollectionView! 

auf diese Weise teilen Sie dem Compiler mit, dass Ihre collectionView definitiv existiert (weil Sie sie von Ihrem Storyboard aus verlinkt haben).

Alternativ können Sie Ihre collectionView auf folgende Weise binden: 

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

Swift 4 Laden Sie alle Elemente in der Sektion neu 

 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

Swift 3 Versionscode

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

als Anfänger wusste ich nicht, dass es einen Unterschied gibt, wenn Sie eine collectionView als direktes untergeordnetes Element von einem anderen viewController implementieren und als eingebettete Ansicht in einen viewController implementieren. Vielleicht haben einige Entwickler das gleiche Problem und wissen nicht, Wenn ja, suche nach dem richtigen Ansatz :)

0
karique

Wenn Sie für eine einzelne Zelle neu laden möchten, können Sie das Spezifische der Zelle wie folgt angeben:

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

Hoffe das hilft.

0
Nizzam