如何刷新UITableViewController或NSFetchedResultsController?
我的UITableViewController或NSFetchedResultsController有一点问题。 我不确定哪个是问题,但我猜它是UITableViewController。
正如我所说我使用NSFetchedResultsController来填充我的数据到一个UITableViewController。 数据按日期排序,并按日期年份显示,例如2010年5月/ 2010年6月/等。 这显示为部分标题。
现在,当我添加新数据时,它会自动使用当前日期作为默认值,但如果我想使用日期,该日期目前不在节列表中,例如2010年4月(目前列表中的5月和6月),那么这是没有正确显示。 只有当我退出应用程序并重新启动时,它才会显示新节标题,并且一切正常。
所以我不知何故需要能够刷新我的列表或更新它。 只需将其添加到上下文中并更改它似乎不会更新它。
同样,我不知道我需要更新什么,如果它是我的NSFetchedResultsController对象或UITableViewController。
更新#1:
我只是觉得这个方法有个例外:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
这是我移动数据的地方:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
UITableView *tableView = self.tableView;
switch(type)
{
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
// [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
// Reloading the section inserts a new row and ensures that titles are updated appropriately.
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
这种方法很大程度上取自Apple的CoreDataBooks示例。 这是错误的:
严重的应用程序错误。 在调用-controllerDidChangeContent:期间,NSFetchedResultsController的委托捕获到异常。 *** - [NSMutableArray removeObjectAtIndex:]:索引1超出边界[0..0]与userInfo(null)
之后,编辑模式(删除按钮出现)不再起作用。
谢谢。
好吧,看起来我找到了解决方案,我只是跳过这些
[self.tableView beginUpdates];
[self.tableView endUpdates];
并始终这样做。
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView reloadData];
}
我显然会给出一些更多的逻辑,因为只有当我想将数据移动到以前不存在的部分时才会出现问题。 在有人能给我一个真正的解决方案之前,我会用这个。
在1.2版iPhoneCoreDataRecipes中采用苹果的修补程序,正确的做法是替换
// Reloading the section inserts a new row and ensures that titles are updated appropriately.
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
同
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
(FileMerge是你的朋友!)
请注意,1.2版本中还有一个修复程序,可以在创建新条目时防止错误崩溃。 我已经报道了这一点,并在两周内得到修复。 我鼓励你用Apple提交错误报告。 他们比你想象的要快得多,你可以期待得到最好的解决方案。
您需要实现controller:didChangeSection:atIndex:forChangeType:
delegate方法。 在此,根据报告的更改类型,将insertSections:withRowAnimation:
, deleteSections:withRowAnimation:
和reloadSections:withRowAnimation:
messages发送到您的表视图。
上一篇: How to refresh a UITableViewController or NSFetchedResultsController?