2011-01-06 3 views
1

Я реализует метод для удаления строки из моего Tableview на основе объекта домена, но я получаю сообщение об ошибке после deleteRowsAtIndexPath вызова: анимированныеUITableView deleteRowsAtIndexPath, когда обновлять модель?

Blockquote нагрузочного приложение из-за неперехваченное исключение «NSInternalInconsistencyException», почему-то : «Неверное обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (2), должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (2), плюс или минус количество вставленных или удаленных строк из этого раздела (0 вставлено, 1 удалено).

Итак, я подумал: «Хорошо, я слишком быстро обновляю модель». Код:

- (void)deleteItem:(Item *)item { 
    NSInteger index = [items indexOfObject:item]; // items is the model a NSArray 
    if (index != NSNotFound) { 
     NSMutableArray *itemEditable = [items mutableCopy]; 
     [itemEditable removeObjectAtIndex:index]; 
     self.items = itemEditable; 

     NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:index inSection:0]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationMiddle]; 
    } 
} 

А потом изменить код, чтобы обновить модель после я называю deleteRowsAtIndexPath: анимированные

- (void)deleteItem:(Item *)item { 
    NSInteger index = [items indexOfObject:item]; // items is the model a NSArray 
    if (index != NSNotFound) { 
     NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:index inSection:0]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationMiddle]; 

     NSMutableArray *itemEditable = [items mutableCopy]; 
     [itemEditable removeObjectAtIndex:index]; 
     self.items = itemEditable; 

    } 
} 

Но это не решало, единственное, что меняется это число строк в сообщении об ошибке от 2 до 3.

Заключительное приложение Blockquote из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: неверный номер строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (3), должно быть равно количеству строк, содержащихся в этом разделе, перед обновлением (3), плюс или минус количество вставленных или удаленных строк из этого раздела (0 вставлено, 1 удалено). '

Где я могу обновить модель?


метод Добавлена ​​numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [items count]; 
} 
+0

Модель должна быть обновлена ​​перед deleteRowsAtIndexPath. Можете ли вы опубликовать метод numberOfRowsInSection? – Anna

+0

Конечно, я могу, просто сделал это. –

ответ

3

Я нашел проблему. Свойство setter items реализуется для вызова reloadData, и это вызывает эту путаницу.

-(void) setItens:(NSMutableArray *)newItens{ 
    if (itens != nil) { 
     [itens release]; 
     itens = nil; 
    } 
    itens = [newItens copy]; 
// [tableView reloadData]; // WRONG don't do this 
} 

Это второй раз, когда я нашел то, что я делал неправильно, сразу после публикации вопроса здесь. Надеюсь, это поможет кому-нибудь в один прекрасный день. Благодаря aBitObvious, я aBitShy сейчас :)

+9

Не беспокойтесь @Felipe. Однажды я услышал о компании-разработчике, у которой была небольшая резиновая утка, которую они держали в качестве талисмана офиса. Политика была, прежде чем вы могли беспокоить кого-либо еще с проблемой, которую вы должны были объяснить этому доктору. И было удивительно, сколько раз у ducky было решение проблемы! Точка, формулирующая вашу проблему достаточно, чтобы объяснить ее кому-то еще, - это то, что нужно, чтобы понять ее достаточно, чтобы иметь необходимый момент «ага». –

-1

Я думаю, что после удаления строки необходимо перезагрузить его чуть ниже удаляемой строки:

Я имею в виду,

- (void)deleteItem:(Item *)item 
{ 
     .......................your code.............. 

    [tableView reloadData]; 
} 

Try это, он должен Работа.

+0

Нет, методы удаления и вставки уже перезагружены. Нет необходимости делать это. –

Смежные вопросы