collectionView: reloadData opere, reloadItemsAtIndexPaths non

Ho un UICollectionView la cui fonte dei dati i cambiamenti a volte, quando offscreen. Aggiornamento al ritorno, ho scritto in CollectionViewController:

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

…e che funziona, ma non ho mai bisogno di aggiornare più di una o due cellule nel mio UICollectionView, così ho pensato che sarebbe stato meglio se avessi sostituito la precedente versione con:

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

…ma quando lo faccio, Xcode mi dà un errore dicendo:

Operando di postfix ‘!’ dovrebbe avere tipo opzionale, eliminare ‘!'”.

Quando si elimina il ‘!’, si dice che UICollectionView non sono un membro nominato reloadItemsAtIndexPaths. Che cosa sto facendo di sbagliato?

  • Mostra la versione del codice con reloadItems
  • Stai usando un UICollectionViewController, o un UIViewController con una collezione vista in esso? Se quest’ultimo, come stai dichiarando “collectionView”?
  • Ho modificato la mia domanda per mostrare il mio tentativo con .reloadItemsAtIndexPaths @rdelmar – sto usando un UICollectionViewController grazie!
  • Come si fa a creare myArrayOfIndexPaths?
  • Non ottengo alcun errore quando uso il codice (in sostituzione myArrayOfIndexPaths con [NSIndexPath(forItem: 0, inSection: 0)]). È stata aggiunta una presa di corrente per la raccolta di vista (o utilizzare la presa di corrente che si ottiene con la raccolta view controller)? A volte Swift errori non vanno bene, provare a sostituire myArrayOfIndexPaths con quello che avevo, e vedere se che silenzia l’errore.
  • Io non collegare il mio viewController correttamente come indicato da Valentin qui di seguito (e penso che si sta suggerendo così). Grazie per l’aiuto!
  • Non si dovrebbe collegare la collezione di vista a tutti, se si utilizza un UICollectionViewController — ha una presa per la sua collezione di visualizzazione di default.



5 Replies
  1. 20

    Dal codice sembra che avete dichiarato la vostra collectionView come Optional (con ?) alla fine e forse collegato al vostro storyboard utilizzando un @IBOutlet. Per risolvere il problema è necessario rimuovere l’ ? da :

    @IBOutlet var collectionView: UICollectionView?

    e sostituire con:

    @IBOutlet var collectionView: UICollectionView!

    in questo modo si indica al compilatore che il collectionView sicuramente esiste (perché si sono collegati dal tuo storyboard).

    In alternativa, è possibile associare il tuo collectionView facendo questo:

    if let collectionView = collectionView {
        collectionView.reloadItemsAtIndexPaths(myArrayOfIndexPaths)
    }
    • Che è-grazie! Apprezzo la spiegazione e grazie per rispondere alle domande di un principiante!
    • Sei il benvenuto!
  2. 6

    Swift 4 ricaricare tutti gli articoli nella sezione

     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])
    }
  3. 4

    Swift 3 versione codice

    var indexPaths = [IndexPath]()
    indexPaths.append(indexPath) //"indexPath" ideally get when tap didSelectItemAt or through long press gesture recogniser.
    collectionView.reloadItems(at: indexPaths)
    • dove posso trovare quelle indexPaths da please? Strettamente Swift 3 per favore.
    • Spero di codice riportato di seguito aiuterà a capire. func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { indexPaths.append(indexPath) }
    • Posso capire il codice. il problema è che reloadData() non è di aggiornare il mio indexPaths anche se il mio dataSource hase è stato compilato. questo significa che non posso accedere a valori più alti indici (dal server) ma non posso accedere solo ai dati di esempio posso inserire manualmente prima di scaricare i dati del server.
    • Scusa per la risposta in ritardo, ero impegnato con il carico di lavoro. Ho bisogno di capire il vostro scenario in dettagli se ancora non risolve il problema, si prega di scrivere qui, in particolare, così io posso contribuire con il mio impegno per risolvere il tuo problema. Grazie
    • questa risposta non aiuta… si prega di aggiungere ulteriori dettagli nella risposta, dove scrivere il codice? il contesto più
  4. 1

    come un principiante non sapevo che c’è una differenza quando si implementa un collectionView come un figlio diretto da un altro viewController e implementare come un embedded view all’interno di un viewController, forse alcuni dev sta affrontando lo stesso problema e non so, se è così, cercate l’approccio corretto 🙂

  5. 0

    Se si desidera ricaricare per singola cella, è possibile specificare le specifiche della cella in questo modo :-

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

    Spero che questo aiuta.

Lascia un commento