2013-02-18 11 views
8

Sì, ci sono così tante domande da porre sullo stack overflow su titoli di domanda simili. Li ho letti tutti ma non ho mai visto il mio problema equivalente a loro. Ora il mio problema è se quando aggiorno la sezione di tabella 0 avendo 3 righe al click di headerview sulla sezione 0 e poi di nuovo clicco sulla stessa intestazione per eliminare tutte e 3 le righe dalla sezione 0, questo funziona bene con me. Ma se apro (aggiorna la sezione 0 con 3 righe) e poi faccio clic su un'altra sezione di intestazione (un'altra sezione che voglio aprire poi dopo la sezione 0) la mia applicazione si è bloccata. Voglio dire, se faccio clic su un'altra sezione, la mia altra sezione dovrebbe essere aperta e la sezione aperta precedente dovrebbe chiudersi. vedere il mio codice per le sezioni di inserimento e cancellazione e righe,Aggiornamento vista tabella 'NSInternalInconsistencyException', motivo: 'Aggiornamento non valido: numero di righe non valido?

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

E i miei metodi di data-source,

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

mia relazione crash, fallimento asserzione in - [UITableView _endCellAnimationsWithContext:],/SourceCache /UIKit_Sim/UIKit-2372/UITableView.m:1070 2013-02-18 11: 44: 49.343 ManageId [1029: c07] Termine dell'app a causa di eccezione non rilevata 'NSInternalInconsistencyException', motivo: 'Aggiornamento non valido: numero di righe non valido in sezione 0. Il numero di righe contenute in una sezione esistente dopo l'aggiornamento (0) deve essere uguale al numero di righe contenute in quella sezione prima dell'aggiornamento (3), più o meno il numero di righe inserite o eliminate da quella sezione (0 inserito, 1 cancellato) e più o meno il numero di righe spostate all'interno o all'esterno di quella sezione (0 spostato in, 0 spostato all'esterno). '

Supponiamo semplicemente che le mie 2 sezioni contengano 3 - 3 righe, quindi funzionerà. Ma se 2 sezioni contengono 3 - 2 righe, allora si bloccherà. Voglio passare due sezioni clic su l'aggiornamento dell'intestazione della sezione con numeri incoerenti di righe in quelle sezioni.

Than

+0

Prova eliminazione di righe prima e aggiornamenti finali quindi inserire righe con nuova update.Or usa il metodo reloadData e aggiungerà automaticamente le righe in base ai valori dell'origine dati. – fibnochi

+0

@fibnochi, ho già fatto tutti i modi. Ma nessun successo. – Tirth

+0

Prova inserimento seguito dalla cancellazione di righe. In questo modo il numero di righe sarà aggiunto prima e poi cancellato. – fibnochi

risposta

4

ho scoperto che si prega di sostituire il codice nel codice con quel codice. è necessario eliminare i dati con vecchio indice non con quella attuale .... la linea commentata era tuo prega di verificare che ...

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]; 
} 
Problemi correlati