2013-02-18 10 views
8

Ja, es gibt so viele Fragen, Fragen auf Stapelüberlauf auf ähnlichen Titel der Frage. Ich lese alle, aber ich sehe nie, dass mein Problem ihnen entspricht. Jetzt ist mein Problem, wenn ich Tabellenabschnitt 0 mit 3 Zeilen auf Klick von Headerview auf Abschnitt 0 aktualisiere und dann wieder klicke ich auf den gleichen Header zum Löschen aller 3 Zeilen aus dem Abschnitt 0, das funktioniert gut mit mir. Aber wenn ich öffne (Abschnitt 0 mit 3 Zeilen aktualisiere) und dann auf einen anderen Headerabschnitt klicke (ein anderer Abschnitt, den ich öffnen möchte, dann nach dem 0. Abschnitt), stürzte meine Anwendung ab. Ich meine, ich will, wenn ich anderen Abschnitt klicke, dann sollte mein anderer Abschnitt offen sein und der vorhergehende offene Abschnitt sollte schließen müssen. siehe mein Code für das Einfügen und Löschen Abschnitte und Zeilen,Tableview update 'NSInternalInconsistencyException', Grund: 'Ungültiges Update: ungültige Zeilenanzahl?

-(void)sectionHeaderView:(TableHeaderView*)sectionHeaderView sectionOpened:(NSInteger)section{ 

self.sectionOpen = YES; 
//Create an array containing data of rows and section which to be inserted in tableView. 
NSMutableArray *dataInsertArray = [NSMutableArray arrayWithArray:[self.tableDataSourceDictionary objectForKey: [self.sortedKeys objectAtIndex:section]]]; 
NSInteger countOfRowsToInsert = [dataInsertArray count]; 

NSMutableArray *indexPathsToInsert = [[NSMutableArray alloc] init]; 
for (NSInteger i = 0; i < countOfRowsToInsert; i++) { 
    [indexPathsToInsert addObject:[NSIndexPath indexPathForRow:i inSection:section]]; 
} 
[self.tableContents setObject:dataInsertArray forKey:[self.sortedKeys objectAtIndex:section]]; 

//Create an array containing data of rows and section which to be delete from tableView. 
NSMutableArray *indexPathsToDelete = [[NSMutableArray alloc] init]; 
NSInteger previousOpenSectionIndex = self.openSectionIndex; 
if (previousOpenSectionIndex != NSNotFound) { 

    self.sectionOpen = NO; 
    [previousTableHeader toggleOpenWithUserAction:NO]; 
    NSInteger countOfRowsToDelete = [[self.tableContents objectForKey: [self.sortedKeys objectAtIndex:section]] count]; 
    for (NSInteger i = 0; i < countOfRowsToDelete; i++) { 
     [indexPathsToDelete addObject:[NSIndexPath indexPathForRow:i inSection:previousOpenSectionIndex]]; 
    } 

    [self.tableContents removeObjectForKey:[self.sortedKeys objectAtIndex:previousOpenSectionIndex]]; 
} 

// Apply the updates. 
[self.tableView beginUpdates]; 
[self.tableView deleteRowsAtIndexPaths:indexPathsToDelete withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView insertRowsAtIndexPaths:indexPathsToInsert withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView endUpdates]; 

self.openSectionIndex = section; 
self.previousTableHeader = sectionHeaderView; 
} 

Und meine Daten-Source-Methoden,

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
NSInteger numberOfSection = [self.sortedKeys count]; 
return numberOfSection; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
NSArray *listData =[self.tableContents objectForKey: [self.sortedKeys objectAtIndex:section]]; 
NSInteger numberOfRows = [listData count]; 
return numberOfRows; 
} 

Mein Crash-Bericht, Assertionsfehler in - [UITableView _endCellAnimationsWithContext:]/SourceCache /UIKit_Sim/UIKit-2372/UITableView.m:1070 2013-02-18 11: 44: 49.343 ManageId [1029: c07] Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSInternalInconsistencyException', Grund: 'Ungültiges Update: ungültige Anzahl von Zeilen in Abschnitt 0. Die Anzahl der Zeilen in einem vorhandenen Abschnitt nach Das update (0) muss der Anzahl der Zeilen in diesem Abschnitt vor der Aktualisierung entsprechen (3), plus oder minus der Anzahl der Zeilen, die aus diesem Abschnitt eingefügt oder gelöscht wurden (0 eingefügt, 1 gelöscht) und plus oder minus der Zahl von Reihen, die in diesen Abschnitt hinein- oder hinausbewegt wurden (0 eingezogen, 0 ausgezogen). "

Angenommen, meine 2 Abschnitte enthalten 3 - 3 Zeilen, dann funktioniert die Datei Aber wenn 2 Abschnitte 3 - 2 Zeilen enthalten, stürzt es ab. Ich möchte zwei Abschnitte umschalten, indem ich auf Kopfzeile des Abschnitts aktualisieren mit inkonsistenten Zeilenzahlen in diesen Abschnitten klicke.

als

+0

Versuchen Verwenden Sie die reloadData-Methode und fügt automatisch Zeilen basierend auf Datenquellenwerten hinzu. – fibnochi

+0

@fibnochi, ich habe schon alle Möglichkeiten. Aber kein Erfolg. – Tirth

+0

Versuchen Sie, Einfügen, gefolgt von dem Löschen von Zeilen. Auf diese Weise wird die Anzahl der Zeilen zuerst hinzugefügt und dann gelöscht. – fibnochi

Antwort

4

Ich fand, dass Sie diesen Code in Ihrem Code mit diesem Code ersetzen. ersten und Ende Updates dann Einfügen von Zeilen mit neuen update.Or müssen Sie Daten mit altem Index nicht mit aktuellen löschen .... die Kommentarzeile war Sie bitte darauf, dass ...

Löschen von Zeilen
if (previousOpenSectionIndex != NSNotFound){ 
 self.sectionOpen = NO; 
[previousTableHeader toggleOpenWithUserAction:NO]; 

//NSInteger countOfRowsToDelete = [[self.tableContents objectForKey: [self.sortedKeys objectAtIndex:section]] count]; 
NSInteger countOfRowsToDelete = [[self.tableContents objectForKey: [self.sortedKeys objectAtIndex:previousOpenSectionIndex]] count];    

for (NSInteger i = 0; i < countOfRowsToDelete; i++) { 
[indexPathsToDelete addObject:[NSIndexPath indexPathForRow:i inSection:previousOpenSectionIndex]]; 
 } 

[[self.tableContents objectForKey: [self.sortedKeys objectAtIndex:previousOpenSectionIndex]] removeAllObjects]; 
} 
Verwandte Themen