我在UITableView的底部添加了一个新项目,插入项目后,我希望UITableView滚动到最底部以显示新插入的项目。新项目保存到Core Data,UITableView使用NSFetchedResultsController自动更新。
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath
{
switch (type) {
case NSFetchedResultsChangeInsert:
NSLog(@"*** controllerDidChangeObject - NSFetchedResultsChangeInsert");
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
//THIS IS THE CODE THAT DOESN'T WORK
[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
break;
....
}
这会导致出界错误,我似乎无法使其发挥作用。我可以通过调整索引路径的行来滚动到第二个到最后一个注释,但我无法到达最后一个项目。
基本上,我在评论表中添加评论,在添加评论后,我希望该表滚动到最新评论。
答案 0 :(得分:16)
您需要致电endUpdates
,以便tableView
可以计算其新的部分和行。一个简单的案例看起来像这样:
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:insertedIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
[self.tableView scrollToRowAtIndexPath:insertedIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
当您使用NSFetchedResultsController
时,它会有点复杂,因为调用beginUpdates
,insertRowsAtIndexPaths:withRowAnimation:
和endUpdates
通常位于不同的委托方法中。你能做什么是
insertedIndexPath
以存储插入的索引路径-insertRowsAtIndexPaths:withRowAnimation:
中-controller:didChangeObject:atIndexPath:
来电后,添加
self.insertedIndexPath = insertedIndexPath;
[self.tableView endUpdates]
-controllerDidChangeContent:
之后添加
if (self.insertedIndexPath) {
[self.tableView scrollToRowAtIndexPath:self.insertedIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
self.insertedIndexPath = nil;
}
答案 1 :(得分:0)
看看这是否有帮助......
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];