2015-04-14 16 views
14

C'è un modo per ricaricare celle specifiche UITableView con più sezioni con animazioni?Ricarica cella di visualizzazione tabella con animazione (Swift)

ho usato:

self.TheTableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.Right) 

Questa anima tutte le cellule nella sezione però. L'altra opzione è quella di utilizzare:

self.TheTableView.reloadRowsAtIndexPaths(<#indexPaths: [AnyObject]#>, 
             withRowAnimation: <#UITableViewRowAnimation#>) 

EDIT:

Dopo aver utilizzato reloadRowsAtIndexPaths

terminazione app causa eccezione non identificata 'NSInternalInconsistencyException', ragione: 'aggiornamento non valida: numero non valido di righe nella sezione 1 Il numero di righe contenute in una sezione esistente dopo l'aggiornamento (5) deve essere uguale al numero di righe contenute in quella sezione prima dell'aggiornamento (4), più o meno il numero di righe inserite o eliminate da quella sezione (0 inserito, 0 cancellato) e più o meno il numero di righe spostate all'interno o all'esterno di quella sezione (0 mesi ved-in, 0 si è trasferito fuori. '

Tentativo di trovare un modo semplice per ricaricare una vista tabella aggiungendo oggetti a un array.

Chiamare TheTableView.reloadData() prima che reloadRowsAtIndexPaths funzioni, ma l'animazione è glitch. C'è un altro approccio?

+0

in [] ciò che ha finito per accadendo !? – user1019042

+0

Forse dovresti dare un'occhiata a questo post http://stackoverflow.com/questions/20987585/ios-inserting-multiple-rows-in-uitableview-with-insertrowsatindexpaths –

risposta

10

Perché non ricaricare le celle direttamente? IndexPath contiene la sezione e la riga in modo da tenere traccia di quale sezione si desidera ricaricare e riempire gli indici in quella matrice.

var indexPath1 = NSIndexPath(forRow: 1, inSection: 1) 
var indexPath2 = NSIndexPath(forRow: 1, inSection: 2) 
self.tableView.reloadRowsAtIndexPaths([indexPath1, indexPath2], withRowAnimation: UITableViewRowAnimation.Automatic) 

Sulla base della sua commento si sta cercando di modificare la matrice e hanno il tableView animano nei cambiamenti. In questo caso, dovresti prendere in considerazione l'utilizzo di beginUpdates() e endUpdates() per UITableViews o anche di un NSFetchedResultsController in modo che gestisca tutte le animazioni di aggiornamento in modo pulito.

self.tableView.beginUpdates() 
// Insert or delete rows 
self.tableView.endUpdates() 

Mi consiglia di utilizzare NSFetchedResultsController se si sta utilizzando Core Data in quanto semplifica l'intero processo. Altrimenti devi gestire tu stesso le modifiche. In altre parole, se l'array cambia, devi rimuovere o inserire manualmente le righe in tableview utilizzando beginUpdates() e endUpdates(). Se non si utilizza Core Data, studiare this per capire come è gestito tutto.

+0

Terminare l'app a causa dell'eccezione non rilevata 'NSInternalInconsistencyException', motivo: 'Aggiornamento non valido: numero di righe non valido nella sezione 1. Il numero di righe contenute in una sezione esistente dopo l'aggiornamento (5) deve essere uguale al numero di righe contenute in quella sezione prima dell'aggiornamento (4), più o meno il numero di righe inserite o eliminate da quella sezione (0 inserite, 0 cancellate) e più o meno il numero di righe spostate all'interno o all'esterno di quella sezione (0 spostato in, 0 spostato all'esterno). ' –

+0

Questo potrebbe funzionare, ma ho bisogno di ricaricare i dati prima di poter chiamare reloadRowsAtIndexPaths. Ho intenzione di giocherellare un po 'con questo. Forse chiamando ReloadData appena prima di quel comando? –

+0

Non è possibile chiamare reloadData se si desidera un'animazione pulita. Guarda in beginUpdates() e endUpdates() se i tuoi dati stanno cambiando. UITableViewControllers utilizza questo per rendere le cose molto più semplici (se si adatta al tuo modello di app) –

4

In Swift 3.0

Siamo in grado di ricaricare la riga particolare della sezione particolare a Tableview

let indexPath = IndexPath(item: 2, section: 0) 
self.tableView.reloadRows(at: [indexPath], with: .automatic) 
2

Se si desidera ricaricare singola sezione a Swift 3.0 si può fare questo:

tableView.reloadSections(IndexSet(integer: 0), with: .automatic) 
2

il define IndexSet nel documento ufficiale:

Gestisce un valore Set di valori interi, che vengono comunemente utilizzati come un tipo di indice nell'API Cocoa. L'intervallo di valori interi validi è in (0, INT_MAX-1). Qualsiasi cosa al di fuori di questo intervallo è un errore.

così IndexSet è impostato su indice, solo mettendo alcuni valori Int

// for reload one section 
tableView.reloadSections([section], with: .automatic) 
// or using like this 
tableView.reloadSections(IndexSet(integer: section), with: .automatic) 

// for reload multi sections 
tableView.reloadSections([1, 2, 3, section], with: .automatic) 
+1

Si prega di aggiungere più descrizione e/o informazioni sulla tua risposta e su come risolve il problema richiesto così gli altri possono facilmente capirlo senza chiedere chiarimenti – koceeng

+0

Ciao @koceeng, sono nuovo in Swift. Per quanto ne so, IndexSet è un insieme di indici, e documento ufficiale lo spiega quando si definisce IndexSet: /// Gestisce un 'Set' di valori interi, che sono comunemente usati come un tipo di indice nell'API Cocoa. /// L'intervallo di valori interi validi è 0 ..

+0

Non fraintendetemi. La tua risposta è più che benvenuta qui, lo apprezziamo davvero. Ma sarà più interessante e più facile da capire se fornisci qualche dettaglio/descrizione. In realtà, il tuo commento sopra è davvero buono da menzionare nella tua risposta, vedi. Perché un sacco di volte, chi cerca una risposta ignora semplicemente il commento. Puoi modificare la tua risposta e includere il tuo commento sopra. Buona giornata :) – koceeng

Problemi correlati