我正在使用PFQueryTableViewController和Local Datastore。我想让用户使用以下代码从表中删除对象:
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the row from the data source
PFObject * object = [self.objects objectAtIndex: indexPath.row];
[object deleteInBackgroundWithBlock: ^ (BOOL succeeded, NSError * error) {
[self loadObjects];
}];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
我明白了 ***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后的现有部分中包含的行数(2)必须等于行数在更新(2)之前包含在该部分中,加上或减去从该部分插入或删除的行数(插入0,删除1)并加上或减去移入或移出该部分的行数(0移入,0搬出去。'
我认为,这是PFQueryTableViewController中的注释用法,但我找不到解决方案。 非常感谢。
答案 0 :(得分:0)
从阵列中删除对象时,您需要更改UITableView
让我们假设您从一个名为objectsArray
的数组中开始使用100个对象。
现在您刚刚从UITableView
删除了一些行:[tableView deleteRowsAtIndexPaths:....]
因此,我们假设您从objectsArray
删除了3行,这意味着您删除了UITableView
中的有形行,因此UITableView
认为numberOfRows..
= 100 - 3.但它没有&# 39; t,因为您还没有更新数组以减去刚刚删除的3个对象。
所以你实际上是在删除那些有形的3行之前重新加载tableView [self loadObjects]
,或者在你的情况下因为inBackground
部分而重新加载。换句话说,在您尝试为从tableView中删除的行设置动画之前,再次重新加载objectsArray
。这种情况发生得不够快,特别是因为你把它放在异步回调中,为了性能起见你可能不应该这样做。简而言之,您需要在删除行后更新数组,以便numberOfRowsInSection
始终反映正确的对象数
如果您的数据是敏感的并且您需要等待回调成功deleteInBackground
,那么您还应该更新您的tableView,因为您永远不知道该方法何时会实际上完成了:
..deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
if (succeeded) {
//get main thread
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self loadObjects];
} else {
//error in deleting them
}
}