7

我在 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;

   ....
}

这会导致越界错误,我似乎无法使其工作。我可以通过调整索引路径的行滚动到倒数第二条评论,但我无法到达最后一项。

基本上,我在评论表中添加评论,添加评论后,我希望表格滚动到最新评论。

4

2 回答 2

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通常在不同的委托方法中。那时你能做的是

  1. 添加一个属性insertedIndexPath来存储插入的索引路径
  2. -insertRowsAtIndexPaths:withRowAnimation:调用之后-controller:didChangeObject:atIndexPath:,添加

    self.insertedIndexPath = insertedIndexPath;
    
  3. [self.tableView endUpdates]在之后-controllerDidChangeContent:,添加

    if (self.insertedIndexPath) {
        [self.tableView scrollToRowAtIndexPath:self.insertedIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
        self.insertedIndexPath = nil;
    }
    
于 2012-06-20T23:01:03.550 回答
0

看看这是否有帮助...

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
于 2012-06-20T22:36:50.377 回答