【发布时间】:2012-04-18 05:29:25
【问题描述】:
概述:
我有一个 iOS 项目,其中包含以下内容:
- 核心数据(使用
NSFetchedResultsController) - 在表格视图中显示数据 (
UITableView)
我想做的事:
- 当用户添加记录时,我想滚动到新添加的记录。
我做了什么
- 添加新记录时,在
NSFetchedResultsControllerDelegate方法内部,当类型为插入/更新/移动时,我将索引路径存储在属性lastAddedIndexPath中 - 调用保存后,我滚动到“lastAddedIndexPath”
代码(NSFetchedResultsControllerDelegate)
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
{
switch(type)
{
case NSFetchedResultsChangeInsert:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
NSLog(@"going to store insert - scroll");
self.lastAddedIndexPath = newIndexPath;
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
NSLog(@"going to store update - scroll");
self.lastAddedIndexPath = newIndexPath;
break;
case NSFetchedResultsChangeMove:
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
NSLog(@"going to store move - scroll");
self.lastAddedIndexPath = newIndexPath;
break;
}
}
}
滚动代码
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
if (self.beganUpdates) //already [self.tableView beginUpdates] invoked
{
[self scrollToLastAddedIndexPath]; //contains the logic to scroll
[self.tableView endUpdates];
}
}
问题
- 我认为记录是在不同的线程中异步添加到表视图中的。
- 所以即使保存数据库后,当我滚动到
lastAddedIndexPath时,表中的记录还不存在。
问题
- 将记录添加到表格视图后,如何滚动到新添加的记录路径?
- 我应该使用通知来了解数据库的保存时间吗?
- 还有其他替代方法吗?
【问题讨论】:
-
您的 [self.tableView endUpdates] 调用在哪里?您希望滚动在此之后发生。
-
我在 controllerDidChangeContent 中执行滚动:我已重新编辑问题以显示代码。
-
那么如果你切换滚动并且结束更新会发生什么?
-
太棒了!!!!!!!非常感谢你,拯救了我的一天,我整天都在打破我的头。而问题是,在table view末尾添加新记录时,indexPath.row大于[self.tableView numberOfRowsInSection:indexPath.section],导致crash
-
我会把它作为答案发布,然后!
标签: ios uitableview core-data nsfetchedresultscontroller