2009-06-16 27 views
13

Ten problem sprawia, że ​​jestem zajęty przez ostatnie godziny. Mam dwie sekcje z jednym rzędem w każdej sekcji. Kiedy usuwam wiersz w jednej z sekcji, niż on zgłasza wyjątek mówiąc, że jest to nieprawidłowa aktualizacja (liczba wierszy/sekcji przed i po aktualizacji nie są takie same). Jest to zrozumiałe, ponieważ usuwam ostatni wiersz sekcji i dlatego usuwam sekcję. Pytanie brzmi, jak uniknąć wyjątku.Jak usunąć ostatni wiersz sekcji?

Wszystko jest w porządku z moim źródłem danych. Sprawdziłem i ponownie sprawdziłem (proszę mi wierzyć).

Tak, jak określa tytuł wątku, w jaki sposób usunąć ostatni wiersz sekcji bez uzyskiwania wyjątku?

Dzięki,

Bart

+0

„tytuł wątku” To jest pytanie i odpowiedź miejscu, nie forum. Masz na myśli tytuł pytania. –

Odpowiedz

26

Podczas usuwania wiersza, a ten wiersz jest ostatnim z jej części, trzeba również usunąć sekcję. Zasadniczo należy śledzić zarówno ścieżki IndexPath, które mają zostać usunięte, które są powiązane z wierszami, jak i indeksy dotyczące sekcji, które należy usunąć, ponieważ nie zawierają już wierszy. Można to zrobić w następujący sposób:

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

Po każdym usunąć obiekt z tablicy modelu związanego z konkretnym odcinku Tableview sprawdzić, czy licznik tablica jest zero, w takim przypadku dodać indeks reprezentujący sekcję do indeksów:

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

Ustal wszystkie indexPaths związanych z rzędami zostać usunięty, a następnie zaktualizować tableView następująco:

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

ten pracował dla mnie i o Ci ludzie zasugerowałem podejście.

+0

Ta opcja działa, chociaż po usunięciu ostatniej sekcji zostanie zgłoszony inny wyjątek (ale wymyślę sposób rozwiązania tego problemu). Trudno mi uwierzyć, że to jedyny sposób. Wygląda na to, że jest niezręczny/nieelegancki. To nie działa ;-). Dziękuję za twój wkład. –

+2

Aby dodać do tego, podczas usuwania ostatniego wiersza w sekcji, tylko wywołać deleteSections: withRowAnimation :. Nie nazywam deleteRowsAtIndexPaths: withRowAnimation :. Animacja wygląda tak samo i nie rzuca żadnych wyjątków. – Alex

+0

Jak radzisz sobie z usuwaniem ostatniego wiersza ostatniej sekcji? –

1

Może to może pracować dla Ciebie:

- (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]; 
     } 
    } 
} 

nadzieję, że to, czego szukali.

1

Ten powinno załatwić sprawę:

// 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

Swift 2, po usunięciu danych w modelu

tableView.beginUpdates()      

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

    tableView.endUpdates() 
Powiązane problemy