web-dev-qa-db-fra.com

Utilisation de l'insertion de lignes dans un UITableView

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;
}
32
Bill

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];
}
36
Bill

La réponse aux clics sur la ligne peut être effectuée dans la méthode didSelectRowAtIndexPath, pour indexPath.row == [items count]. Pour l'animation, je suggère de jeter un œil ici , au insertRowsAtIndexPaths:withRowAnimation: méthode. Il y a un article sur la façon de l'utiliser ici .

5
luvieere

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];
    }
}
0
bio