iOS - PFQueryTableViewController - 删除行崩溃

时间:2015-09-06 22:11:49

标签: ios parse-platform

我正在使用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中的注释用法,但我找不到解决方案。 非常感谢。

1 个答案:

答案 0 :(得分:0)

从阵列中删除对象时,您需要更改UITableView

的结构

让我们假设您从一个名为objectsArray的数组中开始使用100个对象。

  • numberOfRowsInSection = return objectsArray.count(即100)
  • cellsForRowAtIndexPath = 100个单元格,或多个将重复使用以显示所有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 
    }
}