删除从未在核心数据中的虚拟行的核心数据异常

时间:2010-07-02 01:30:39

标签: iphone core-data

我有UITableView与核心数据相关联。如果没有条目,我会破解表格以确保#sections = 1,#rows = 1,并且此行显示的文字显示“您的表格为空;使用+按钮添加新项目”。

当用户通过单击+按钮添加他的第一个项目时,核心数据会抛出一个异常,说明更新后的行数(1)不等于更新前的行数(1)加上或减号(1个插入,0个删除)。这是有道理的,因为Core Data可能会查询我的tableview所执行的相同功能(numberOfSectionsInTableViewnumberOfRowsInSection:section)。但是,如何告诉核心数据我对于tableview,并且更新前的行数实际为0?

3 个答案:

答案 0 :(得分:0)

好吧,我想如果我确实保留了一个UITableView,我就会想到一个真正的hacky方法来处理这个问题。写下来以防将来有用。

基本上,创建一个BOOL isUpdating来记录我们当前是否正在更新表格。实施numberOfRowsInSection:section应检查self.isUpdating是否为真;如果是,则返回“谎言”行数(即NSFetchedResultsController期望表具有的数量),否则返回行数以告知tableview。然后在controllerWillChangeContent中将isUpdating设置为true,并在controllerDidChangeContent中将其设置为false。

答案 1 :(得分:0)

这将有助于显示您如何添加行,维护状态等的代码。否则任何答案只会是非常笼统或猜测。

答案 2 :(得分:0)

您可以在此示例

中的NSFetchedResultsControllerDelegate方法中捕获异常
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
  switch(type) {
    case NSFetchedResultsChangeInsert:
      if ([[self.fetchedResultsController sections] count] != 1) {
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
      } else {
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
      }
      break;
    case NSFetchedResultsChangeDelete:
      if ([[self.fetchedResultsController sections] count] != 0) {
        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
      } else {
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
      }
      break;
  }
}

如果您的表中没有部分,请改为使用controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:方法。