我有UITableView
与核心数据相关联。如果没有条目,我会破解表格以确保#sections = 1,#rows = 1,并且此行显示的文字显示“您的表格为空;使用+按钮添加新项目”。
当用户通过单击+按钮添加他的第一个项目时,核心数据会抛出一个异常,说明更新后的行数(1)不等于更新前的行数(1)加上或减号(1个插入,0个删除)。这是有道理的,因为Core Data可能会查询我的tableview所执行的相同功能(numberOfSectionsInTableView
和numberOfRowsInSection:section
)。但是,如何告诉核心数据我对于tableview,并且更新前的行数实际为0?
答案 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:
方法。