2009-06-15 8 views
1

Ich lösche mehrere Zeilen einer Tabelle. Tatsächlich werden bei dieser Gelegenheit alle sichtbaren Zellen tatsächlich gelöscht.Umgang mit nicht sichtbaren Zeilen beim Löschen von Zeilen. (UITableViews)

Dadurch wird die Zelle unmittelbar unterhalb des sichtbaren Rahmens nach der Animation sichtbar, da alle darüber liegenden Zellen verschwunden sind.

Hier ist das Problem, diese Zelle wird ebenfalls gelöscht. So bekomme ich den folgenden Fehler, nehme ich an, weil die Tabellenansicht möchte, dass ich eine Zelle lösche, die nicht auf dem Bildschirm ist. (wird aber während/nach der Animation auf dem Bildschirm angezeigt).

2009-06-15 17:44:30.114 HSS[18175:20b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 4. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).' 
2009-06-15 17:44:30.117 HSS[18175:20b] Stack: (
    807902715, 
    2429263419, 
    807986683, 
    811271572, 
    815059595, 
    815007323, 
    97367, 
    96328, 
    96282, 
    810768858, 
    807687328, 
    807683624, 
    839142449, 
    839142646, 
    814752238, 
    10968, 
    10822 
) 

Was mache ich in dieser Situation?

Code, der die Ausnahme verursacht, folgt. Beachten Sie, dass ich in einer anderen Methode tatsächlich ein neues Array namens "filteredTableGroups" erstelle. Dies ist das aktualisierte Modell. "allTableGroups" ist jeder Cell Controller. Jeder Zellen-Controller enthält ein Wörterbuch zum Auffüllen der Zellendaten. Ich verwende einen Schlüssel, "filteredDataSet", um zu bestimmen, ob eine Zelle in der gefilterten Tabelle verbleiben soll. Während des Löschens der Tabellenansicht tausche ich TableGroups gegen das aktualisierte Modell. (Ich meinen Code ähnlich geschaffen Matt Gallagher und Craig Hockenberry-Lösung von Cell Controller der Verwendung von einzelnen Zellen zu steuern)

- (void)collapseVisableCells{ 

NSMutableArray *cellsToRemove = [NSMutableArray array]; 

for(NSArray *sections in self.allTableGroups){ 

    for(ScheduleCellController *cellController in sections){ 

     NSString *shouldDisplayString = (NSString*)[[cellController model] objectForKey:@"filteredDataSet"]; 

     BOOL shouldDisplay = [shouldDisplayString boolValue]; 

     if(!shouldDisplay){ 

      UITableViewCell *theCell = [cellController myCell]; 

      NSIndexPath *cellPath = [self.tableView indexPathForCell:theCell]; 
      NSLog([cellPath description]); 

      if(cellPath!=nil) 
       [cellsToRemove addObject:cellPath]; 


     } 
    } 

} 



[self.tableView beginUpdates]; 
tableGroups = self.filteredTableGroups; 
[self.tableView deleteRowsAtIndexPaths:cellsToRemove withRowAnimation:UITableViewRowAnimationTop]; 
[self.tableView endUpdates]; 

}

Antwort

3

Ich bin nicht sicher, ob ich das richtig verstanden habe, was du meinst, aber man kann Versuche Folgendes.

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

Jedes Mal, wenn Sie ein Objekt aus dem Modell-Array zu einem bestimmten Abschnitt des Tableview, überprüfen, ob die Array-Zähler null, fügen Sie in diesem Fall sind, die den Abschnitt Indizes einen Index im Zusammenhang löschen:

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

Determine all of the indexPaths related to the rows to be deleted, then update the tableView as follows: 

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

Lassen Sie mich wissen, ob dies für Sie funktioniert.

+1

Ich werde versuchen, "tote Abschnitte" zu entfernen und sehen, ob das mein Problem behebt. Es ist schwer das Problem zu erklären. Das Hauptproblem besteht darin, dass ich Zellen, die nicht auf dem Bildschirm sind, nicht löschen kann, aber dann klagt die Tabellenansicht, dass ich eine Zelle nicht gelöscht habe, die sich außerhalb des Bildschirms befindet. Das Entfernen des gesamten Abschnitts kann Abhilfe schaffen. Aber ich würde dieses erwartete Verhalten nicht nennen. –

+0

Das hat funktioniert. Durch das Löschen der leeren Abschnitte konnte ich das Problem umgehen. Nicht, dass ich leere Abschnitte anzeigen sollte. Es war ziemlich mühsam, die zu löschenden Abschnitte zu verfolgen, aber es funktionierte großartig. Vielen Dank. –