我将一个新项目添加到UITableView的底部,并且在插入该项目之后,我希望UITableView滚动到最底部以显示新插入的项目。新项目将保存到核心数据,并且使用NSFetchedResultsController自动更新UITableView。

- (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;

   ....
}

这导致超出范围的错误,我似乎无法使其正常工作。我可以通过调整索引路径的行来滚动到倒数第二个注释,但是我无法找到最后一个项目。

基本上,我是在注释表中添加注释,添加注释后,我希望表滚动到最新注释。

最佳答案

您需要调用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时,它会稍微复杂一些,因为beginUpdatesinsertRowsAtIndexPaths:withRowAnimation:endUpdates的调用通常使用不同的委托(delegate)方法。那你能做的就是
  • 添加属性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;
    }
    
  • 09-25 17:59