概述:
我有一个 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
表中的记录还不存在时。
问题
- 将记录添加到表视图后,如何滚动到新添加的记录路径?
- 我应该使用通知来了解数据库何时保存吗?
- 还有其他替代方法吗?