2013-02-18 2 views
8

Да, так много вопросов задают при переполнении стека по аналогичному заголовку вопроса. Я читал все, но я никогда не видел, чтобы моя проблема была эквивалентна им. Теперь моя проблема в том, что если я обновляю таблицу раздела 0 с 3 строками при щелчке по заголовку в разделе 0, а затем снова нажимаю на тот же заголовок, чтобы удалить все 3 строки из раздела 0, это отлично работает со мной. Но если я открою (обновить раздел 0 тремя строками), а затем я нажму на другой раздел заголовка (другой раздел, который я хочу открыть после 0-го раздела), мое приложение разбилось. Я хочу сказать, что хочу, если я нажму другой раздел, тогда мой другой раздел должен быть открыт, а предыдущий открытый раздел должен быть закрыт. см моего кода для вставки и удаления разделов и строк,Tableview update 'NSInternalInconsistencyException', причина: 'Неверное обновление: недопустимое количество строк?

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

И мои методы источника данных,

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

Моего отчета об ошибке, отказа утверждения - [UITableView _endCellAnimationsWithContext:]/SourceCache /UIKit_Sim/UIKit-2372/UITableView.m:1070 2013-02-18 11: 44: 49.343 ManageId [1029: c07] Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Недействительное обновление: недопустимое количество строк в раздел 0. Количество строк, содержащихся в существующем разделе после обновление (0) должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (3) плюс или минус количество строк, вставленных или удаленных из этого раздела (вставлено 0, 1 удалено) и плюс или минус число из строк, перемещенных в или из этой секции (0 перемещен, 0 перемещен). '

Просто предположим, что мои 2 секции содержат 3 - 3 строки, тогда он будет работать файл. Но если 2 секции содержат 3 - 2 строки, то это сбой. Я хочу переключить два раздела, щелкнув по обновлению заголовка раздела с непоследовательным числом строк в этих разделах.

Чем

+0

Попробуйте удалить строки первыми и окончание обновление затем вставить строки с новым update.Or используйте метод reloadData и он будет добавлять удаленные строки автоматически на основе значений источника данных. – fibnochi

+0

@fibnochi, я уже делал все. Но успеха нет. – Tirth

+0

Попробуйте вставить, а затем удалите строки. Таким образом, сначала будет добавлено количество строк, а затем удалено. – fibnochi

ответ

4

Я обнаружил, что, пожалуйста, замените этот код в код с этим кодом. вы должны удалить данные со старым одним индексом не с текущим .... комментируемой линией была ваш, пожалуйста, убедитесь, что ...

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]; 
} 
Смежные вопросы