web-dev-qa-db-fra.com

Recharger la cellule de la vue Table avec animation (Swift)

Existe-t-il un moyen de recharger des cellules UITableView spécifiques avec plusieurs sections avec des animations?

J'utilise:

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

Cela anime cependant toutes les cellules de la section. L'autre option consiste à utiliser:

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

ÉDITER:

Après avoir utilisé reloadRowsAtIndexPaths

Arrêt de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'Mise à jour non valide: nombre de lignes non valide dans la section 1. Le nombre de lignes contenues dans une section existante après la mise à jour (5) doit être égal au nombre de lignes contenues dans ce section avant la mise à jour (4), plus ou moins le nombre de lignes insérées ou supprimées de cette section (0 inséré, 0 supprimé) et plus ou moins le nombre de lignes déplacées dans ou hors de cette section (0 déplacé, 0 déplacé en dehors).'

Essayer de trouver un moyen fluide de recharger une table en ajoutant des objets dans un tableau.

L'appel de TheTableView.reloadData () avant que reloadRowsAtIndexPaths fonctionne, mais l'animation est glitchy. Y a-t-il une autre approche?

14
William Larson

Pourquoi ne pas simplement recharger les cellules directement? L'indexPath contient la section et la ligne, il vous suffit donc de garder une trace de la section que vous souhaitez recharger et de remplir les index de ce tableau.

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

En fonction de votre commentaire, vous cherchez à modifier votre tableau et à faire animer la tableView dans les modifications. Si c'est le cas, vous devriez envisager d'utiliser beginUpdates () et endUpdates () pour UITableViews ou même un NSFetchedResultsController afin qu'il gère toutes les animations de mise à jour proprement.

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

Je recommanderais d'utiliser NSFetchedResultsController si vous utilisez Core Data car cela simplifie tout ce processus. Sinon, vous devez gérer les modifications vous-même. En d'autres termes, si votre tableau change, vous devez supprimer ou insérer manuellement des lignes dans la vue de table à l'aide de beginUpdates () et endUpdates (). Si vous n'utilisez pas Core Data, étudiez this pour comprendre comment tout cela est géré.

11
Mark McCorkle

Dans Swift 3.

Nous pouvons recharger une ligne particulière d'une section particulière dans tableview

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

Si vous souhaitez recharger une seule section dans Swift 3.0, vous pouvez le faire:

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

le define IndexSet dans le document officiel:

Gère un Set de valeurs entières, qui sont couramment utilisées comme type d'index dans Cocoa API. La plage de valeurs entières valides est comprise entre (0, INT_MAX-1). Tout ce qui est en dehors de cette plage est une erreur.

donc IndexSet est défini sur index, il suffit de mettre des valeurs Int dans []

// 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)
2
Junhang Lv