2009-06-16 11 views
13

Ce problème m'a occupé pendant les dernières heures. J'ai deux sections avec une rangée dans chaque section. Lorsque je supprime la ligne dans l'une des sections, une exception indique qu'il s'agit d'une mise à jour non valide (le nombre de lignes/sections avant et après la mise à jour n'est pas le même). Cela est compréhensible car je supprime la dernière ligne d'une section et je supprime donc la section. La question est de savoir comment éviter l'exception.Comment supprimer la dernière rangée d'une section?

Tout va bien avec ma source de données. J'ai vérifié et revérifié (croyez-moi). Par conséquent, comme le titre des états de thread, comment supprimez-vous la dernière ligne d'une section sans obtenir une exception?

Merci,

Bart

+0

« titre du fil » Ceci est une question et le site réponse, pas un forum. Vous voulez dire le titre de la question. –

Répondre

26

Lorsque vous supprimez une ligne, et cette ligne est le dernier de sa section, vous devez également supprimer la section. Fondamentalement, vous devez suivre à la fois les indexPaths que vous voulez supprimer, qui sont associés aux lignes, et les index liés aux sections qui doivent être supprimés car ils ne contiennent plus de lignes. Vous pouvez le faire comme suit:

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

Chaque fois que vous supprimez un objet de votre tableau de modèle lié à une section spécifique du tableView, vérifier si le nombre de tableau est égal à zéro, auquel cas ajouter un indice représentant la section aux indices:

[array removeObjectAtIndex:indexPath.row]; 
if(![array count]) 
    [indexes addIndex: indexPath.section]; 

Déterminer tous les indexPaths liés aux lignes à supprimer, puis mettre à jour le tableView comme suit:

[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

Cela a fonctionné pour moi et o à d'autres personnes, j'ai suggéré l'approche.

+0

Cette option fonctionne bien que lorsque vous supprimez la dernière section une autre exception est levée (mais je trouverai un moyen de résoudre ce problème). J'ai du mal à croire que c'est le seul moyen. Il semble si peu/unelegant. Cela ne fonctionne pas seulement ;-). Merci tout de même pour ta contribution. –

+2

Pour ajouter à cela, lorsque je supprime la dernière ligne d'une section, j'appelle seulement deleteSections: withRowAnimation :. Je n'appelle pas deleteRowsAtIndexPaths: withRowAnimation :. L'animation a la même apparence et ne génère aucune exception. – Alex

+0

Comment gérez-vous la suppression de la dernière ligne de la dernière section? –

1

Peut-être que cela peut fonctionner pour vous:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    NSString *key = [self.keys objectAtIndex:section]; 
    NSMutableArray *rowsInSection = [self.dict objectForKey:key]; 
    [rowsInSection removeObjectAtIndex:row]; 

    NSUInteger rowsInSectionCount = [rowsInSection count]; 

    if (rowsInSectionCount > 0) { 
     // If we still have rows in this section just delete the row 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
    else { 
     // There are no more rows in this section 
     [self.dict removeObjectForKey:key]; 
     [self.keys removeObjectAtIndex:section]; 

     NSUInteger sectionCount = [self.keys count]; 

     if (sectionCount > 0) { 
      // If we still have 1 or more sections left just delete this section 
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     else { 
      // If there are no more rows and sections left just delete the last row 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView reloadData]; 
     } 
    } 
} 

Hope this est ce que vous recherchez.

1

Celui-ci devrait faire l'affaire:

// Either delete some rows within a section (leaving at least one) or the entire section. 
    if ([indexPath section] < 0) { 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if ([indexPath section] == 0) { 
     [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
1

Pour Swift 2, après avoir retiré les données dans votre modèle:

tableView.beginUpdates()      

    let indexSet = NSMutableIndexSet() 
    indexSet.addIndex(indexPath.section) 
    tableView.deleteSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade) 

    tableView.endUpdates()