2015-01-13 9 views
7

Ich habe eine UICollectionView, deren Quelldaten manchmal außerhalb des Bildschirms ändert. Um es zu aktualisieren, wenn es zurückkehrt, schrieb ich in den CollectionViewController:collectionView: reloadData funktioniert, reloadItemsAtIndexPaths nicht

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

... und das funktioniert, aber ich brauche nie mehr als ein oder zwei Zellen zu aktualisieren in meinen UICollectionView, so dachte ich, es sei besser, wenn ich ersetzt die obige Version mit:

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

... aber wenn ich es tue, Xcode gibt mir eine Fehlermeldung, dass: '!'

Operanden- von postfix haben optional Typ sollte, löschen ‚!‘“.

Wenn ich die löschen‚!‘, sagt er, dass UICollectionView kein Mitglied reloadItemsAtIndexPaths genannt hat. Was mache ich falsch?

+0

Zeigen Sie die Version des Codes mit 'reloadItems' –

+0

Sie einen UICollectionViewController verwenden oder eine UIViewController mit einer Sammlung Ansicht darin? Wenn letzteres, wie erklärst du "collectionView"? – rdelmar

+0

@David - Ich habe meine Frage bearbeitet, um meinen Versuch mit '.reloadItemsAtIndexPaths' zu zeigen @rdelmar - Ich benutze einen UICollectionViewController danke! –

Antwort

17

Von Ihrem Code sieht es aus wie Sie Ihre Kollektion als Optional erklärt haben (mit?) am Ende und vielleicht verknüpfen es zu Ihrem Storyboard eines @IBOutlet mit Ihrem Problem beheben Sie das entfernen sollen vom:.?

@IBOutlet var collectionView: UICollectionView?

und ersetzen Sie sie durch:

@IBOutlet var collectionView: UICollectionView!

diese Weise können Sie den Compiler sagen, dass Ihre Kollektion existiert definitiv (weil Sie es von Ihrem Storyboard verbunden haben).

Alternativ können Sie Ihre Kollektion binden, indem dies zu tun:

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

Das war's - danke! Ich schätze die Erklärung und danke für die Beantwortung der Fragen eines kompletten Neulings! –

+0

Gern geschehen! – Valentin

3

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) 
+1

woher bekomme ich diese indexPfads von bitte? Strictly Swift 3 bitte. – nyxee

+0

@nyxee Ich hoffe, der folgende Code hilft Ihnen, es zu verstehen. func collectionView (_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { indexPaths.append (indexPath) } – mriaz0011

+0

Ich verstehe den Code. Das Problem ist, dass reloadData() meine indexPfad nicht aktualisiert, selbst wenn meine dataSource gefüllt wurde. das bedeutet, dass ich nicht auf die Werte bei höheren Indizes (vom Server) zugreifen kann, aber ich kann nur auf die Beispieldaten zugreifen, die ich manuell eingegeben habe, bevor ich die Serverdaten heruntergeladen habe. – nyxee

0

Wenn Sie einzelne Zelle neu zu laden möchten, können Sie die spezifischen von angeben die Zelle wie folgt:

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

Hoffnung das hilft.

1

Swift 4 reload alle Elemente im Abschnitt

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]) 
} 
Verwandte Themen