我有一个包含多个部分的tableView。这些部分是从“items”数组填充的,该数组实际上将两个不同的提取请求组合到一个字典数组中。第一个提取请求会提取“未收集”的项目,第二个提取请求会提取“已收集”项目。
表格视图填充正常,我可以相当容易地添加/删除项目。我还可以为未收集的单元格选择附件,它将移动到“收集”部分。我在对数据进行任何更改后使用reloadData执行所有这些操作,现在我正在尝试将其转换为动画插入/删除。我开始从'未收集'过渡到'收集',这将导致从前一部分删除单元格并在后一部分插入。
我对事情的顺序感到有些困惑。据我所知,我应该:
我发现我收到错误:
'NSInternalInconsistencyException', reason: 'Invalid table view update. The application has requested an update to the table view that is inconsistent with the state provided by the data source.
tableView位于TableViewController中,TableViewController是表视图的委托。我认为我已正确实现了numberOfSections,numberOfRows等。在这些中,我从'items'数组返回计数。
我的代码如下。
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
Item *item = [self itemForIndexPath:indexPath];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
UIButton *button = (UIButton *)cell.accessoryView;
if (![item collected]) {
//update item
[item setCollected:YES];
[item setDateCollected:[NSDate date]];
NSError *error = nil;
if (![item.managedObjectContext save:&error]) {
NSLog(@"Error saving collected/uncollected items");
}
//update cell
[button setBackgroundImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];
//update tableview
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:self.items.count]] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
}
else if ([item collected]){...do the opposite
答案 0 :(得分:0)
替换
[NSIndexPath indexPathForRow:0 inSection:self.items.count]
与
[NSIndexPath indexPathForRow:self.items.count inSection:0]