2009-07-08 6 views
2
NSIndexPath* updatedPath = [NSIndexPath indexPathForRow: 0 inSection: 0]; 
NSIndexPath* updatedPath2 = [NSIndexPath indexPathForRow: 1 inSection: 0]; 
NSArray* updatedPaths = [NSArray arrayWithObjects:updatedPath, updatedPath2, nil]; 
[self.mySexyTableView reloadRowsAtIndexPaths:updatedPaths withRowAnimation:UITableViewRowAnimationTop]; 

Le code ci-dessus fonctionne et il anime. Le problème est que j'ai beaucoup de données et je ne veux pas coder en dur les index de ligne. Puisque j'ai seulement une section dans ma section de table peut être 0. Comment est-ce que je peux générer dynamiquement NSArray des objets NSIndexPath?UITableView Animation Headache

Ou existe-t-il un moyen plus simple d'animer la vue tabulaire. Toutes les lignes dans ma vue de table changent lorsque l'utilisateur clique sur l'onglet en haut de la vue de table.

Répondre

7

Pour générer le tableau de chemins d'index, vous pouvez simplement boucle:

NSMutableArray *updatedPaths = [NSMutableArray array]; 
    for (NSNumber *row in someArray) { 
     NSIndexPath *updatedPath = [NSIndexPath indexPathForRow:[row intValue] inSection:0]; 
     [updatedPaths addObject:updatedPath]; 
    } 
    [self.mySexyTableView reloadRowsAtIndexPaths:updatedPaths withRowAnimation:UITableViewRowAnimationTop]; 

Si vous rechargez toutes les données de votre TableView, pourquoi ne pas simplement appeler la méthode reloadData?

+3

reloadData n'anime pas. – bparanj

+0

Quand je lance votre code, j'obtiens ceci: *** échec Assertion en - [_ UITableViewUpdateSupport _setupAnimationsForNewlyInsertedCells], /SourceCache/UIKit/UIKit-963.10/UITableViewSupport.m:541 2009-07-08 09: 14: 42,979 QuartzFun [3781: 207] *** Application terminante due à une exception non interceptée 'NSInternalInconsistencyException', raison: 'Tentative de création de deux animations pour la cellule' 2009-07-08 09:14:42.979 QuartzFun [3781: 207] Stack: ( – bparanj

+0

Si la boucle I: NSMutableArray * updatedPaths = [[NSMutableArray alloc] init]; \t \t \t for (int i = 0; i <[lowlist compte]; i ++) { NSIndexPath * updatedPath = [NSIndexPath indexPathForRow: i insection: 0]; [updatedPaths addObject: updatedPath]; \t \t \t} \t \t \t [self.mySexyTableView reloadRowsAtIndexPaths: updatedPaths withRowAnimation: UITableViewRowAnimationTop]; je reçois: *** Terminaison de l'application due à l'exception non interceptée 'NSRangeException', raison: '*** - [NSMutableIndexSet addIndexesInRange:]: Plage {214747, 1} dépasse la valeur d'index maximale de NSNotFound - 1' QuartzFun [3810: 207] – bparanj

0

J'ai finalement réussi à le faire fonctionner. Voici le code:

NSMutableArray *indexPaths = [[[NSMutableArray alloc] init] autorelease]; 
for (int i = 0; i < [mySexyList count]; i++) { 
    NSIndexPath *updatedPath = [NSIndexPath indexPathForRow:i inSection:0]; 
    [indexPaths addObject:updatedPath]; 
} 

[self.myFunkyTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; 

Le problème était que je rentrais valeur codée en dur de numberOfRowsInSection: méthode qui n'a pas été la même que la taille de mySexyList. Cela plantait l'application.

3

Si vous avez plusieurs indexPathForRow avec un index de ligne égal, vous obtenez cette exception.

Pour erample

[segmentTable reloadRowsAtIndexPaths: [[NSArray alloc] initWithObjects: 
           [NSIndexPath indexPathForRow: 1 inSection: 1], 
           [NSIndexPath indexPathForRow: 1 inSection: 1], nil]         withRowAnimation:UITableViewRowAnimationNone]; 
6

Si vous souhaitez actualiser une section entière:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop]; 
0

On suppose self.arTableData est un tableau mutable de la table & tableView est une instance de UITableView. Supposons qu'il y ait 10 lignes (ce qui signifie 10 objets dans le tableau) dans tableView. J'implémente le code suivant pour supprimer les lignes animées.

int i; // to remove from 3 to 6 
for(i=2;i<6;i++) 
{ 
    [self.arTableData removeObjectAtIndex:i]; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationRight]; 
} 

Cette astuce fonctionne pour moi sans tracas. J'espère que ça marchera pour vous. Bonne chance.

0

Juste pour ajouter ma solution dans le mélange car c'était simple une fois que je l'ai trouvé. Ce qui se passait était que j'avais une table qui est "groupée" par mon propre code en utilisant la même technique que celle trouvée à: cocoanetics.com

Lorsque l'utilisateur fait quelque chose nécessitant une mise à jour d'une cellule, et que la table n'a pas été groupée à à ce moment-là, mon code essayait d'utiliser

[[self tableView] reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationAutomatic]; 

spécifiant des chemins à la fois à la cellule et à l'en-tête inexistant. Cela a causé la même erreur que d'autres ont rapporté ci-dessus. Tout ce que je devais faire était de m'assurer que les "chemins" fournis à reloadRowsAtIndexPaths: withRowAnimation: existaient réellement. Cela fait, tout allait bien.