web-dev-qa-db-fra.com

'Mise à jour non valide: nombre de lignes non valide dans la section 0

J'ai lu tous les articles à ce sujet et j'ai toujours une erreur:

'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

Voici les détails:

dans .h J'ai un NSMutableArray:

@property (strong,nonatomic) NSMutableArray *currentCart;

Dans .m _ mon numberOfRowsInSection ressemble à ceci:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.


    return ([currentCart count]);

}

Pour activer la suppression et supprimer l'objet du tableau:

// Editing of rows is enabled
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //when delete is tapped
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [currentCart removeObjectAtIndex:indexPath.row];


    }
}

Je pensais que si mon nombre de sections reposait sur le nombre de tableaux que je modifiais, cela garantirait le nombre approprié de lignes. Cela ne peut-il pas être fait sans avoir à recharger la table quand vous supprimez une ligne?

62
user3085646

Vous devez supprimer l'objet de votre tableau de données avant vous appelez deleteRowsAtIndexPaths:withRowAnimation:. Donc, votre code devrait ressembler à ceci:

// Editing of rows is enabled
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //when delete is tapped
        [currentCart removeObjectAtIndex:indexPath.row];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

Vous pouvez également simplifier un peu votre code en utilisant le raccourci de création de tableau @[]:

[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
145
Undo

Swift Version -> Supprimer l'objet de votre tableau de données avant d'appeler

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        print("Deleted")

        currentCart.remove(at: indexPath.row) //Remove element from your array 
        self.tableView.deleteRows(at: [indexPath], with: .automatic)
    }
}
6