7

UITableViewの下部に新しいアイテムを追加しています。アイテムを挿入した後、UITableViewを一番下までスクロールして、新しく挿入されたアイテムを表示します。新しいアイテムはCoreDataに保存され、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;

   ....
}

これは範囲外のエラーにつながります、私はそれを機能させることができないようです。インデックスパスの行を調整することで、最後から2番目のコメントまでスクロールできますが、最後の項目に移動できません。

基本的に、コメントのテーブルにコメントを追加します。コメントを追加した後、テーブルを最新のコメントまでスクロールします。

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行われるため、少し複雑になります。その時あなたができることはbeginUpdatesinsertRowsAtIndexPaths: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 に答える