Je voudrais que mon UITableView se comporte comme le tableau dans l'éditeur de contacts, c'est-à-dire que l'utilisateur devrait appuyer sur Modifier et une ligne "ajouter une nouvelle catégorie" devrait apparaître au bas de chaque section.
J'utilise le code ci-dessous pour ce faire, mais le problème est qu'il n'y a pas de transition en douceur comme dans les contacts. Au lieu de cela, la nouvelle ligne apparaît soudainement. Comment puis-je obtenir l'animation?
De plus, comment puis-je répondre aux clics sur la ligne "Ajouter une nouvelle catégorie"? La ligne n'est pas cliquable dans mon implémentation actuelle.
Dois-je recharger les données lorsque l'utilisateur commence à modifier? Je fais cela car sinon les lignes d'insertion ne sont jamais dessinées.
Merci.
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
[self.tableView setEditing:editing animated:animated];
[tableView reloadData];
}
- (NSInteger)tableView:(UITableView *)_tableView numberOfRowsInSection:(NSInteger)section {
// ...
if( self.tableView.editing )
return 1 + rowCount;
}
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// .....
NSArray* items = ...;
if( indexPath.row >= [items count] ) {
cell.textLabel.text = @"add new category";
}
// ...
return cell;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
NSArray* items = ...;
if( indexPath.row == [items count] )
return UITableViewCellEditingStyleInsert;
return UITableViewCellEditingStyleDelete;
}
Il me manquait une chose. Dans setEditing:, au lieu d'appeler reloadData, j'aurais dû faire:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
[self.tableView setEditing:editing animated:animated]; // not needed if super is a UITableViewController
NSMutableArray* paths = [[NSMutableArray alloc] init];
// fill paths of insertion rows here
if( editing )
[self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];
else
[self.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];
[paths release];
}
Un effet secondaire indésirable de la solution mise en évidence est que la ligne "ajouter" est insérée également lorsque l'utilisateur glisse simplement une seule ligne (à condition que le balayage soit activé). Le code suivant résout ce dilemme:
// Assuming swipeMode is a BOOL property in the class extension.
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
// Invoked only when swiping, not when pressing the Edit button.
self.swipeMode = YES;
}
- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
self.swipeMode = NO;
}
Votre code nécessiterait une petite modification:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
[self.tableView setEditing:editing animated:animated]; // not needed if super is a UITableViewController
if (!self.swipeMode) {
NSMutableArray* paths = [[NSMutableArray alloc] init];
// fill paths of insertion rows here
if( editing )
[self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];
else
[self.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationBottom];
[paths release];
}
}