2012-06-20 10 views
7

Dodaję nowy element na dole UITableView i po wstawieniu elementu chcę, aby UITableView przewinął do samego dołu, aby wyświetlić nowo wstawiony element . Nowe pozycje są zapisywane w danych podstawowych, a UITableView jest automatycznie aktualizowany za pomocą NSFetchedResultsController.Przewiń do ostatniego UITableViewCell za pomocą scrollToRowAtIndexPath: atScrollPosition: animowane za pomocą metod NSFetchedResultsControllerDelegate

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

    .... 
} 

To prowadzi do błędu poza granicami, nie mogę sprawić, żeby działało. Mogę przewinąć do drugiego do ostatniego komentarza, dostosowując wiersz indeksu ścieżki, ale nie mogę dostać się do ostatniego elementu.

Zasadniczo dodam komentarz do tabeli komentarzy, a po dodaniu komentarza chcę, aby tabela była przewijana do najnowszego komentarza.

Odpowiedz

16

Trzeba zadzwonić endUpdates tak że tableView może obliczyć swoje nowe sekcje i wierszy. Prosta sprawa będzie wyglądać następująco:

[self.tableView beginUpdates]; 
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:insertedIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView endUpdates]; 
[self.tableView scrollToRowAtIndexPath:insertedIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

Podczas korzystania NSFetchedResultsController, jest nieco bardziej skomplikowana, ponieważ rozmowy zrobić beginUpdates, insertRowsAtIndexPaths:withRowAnimation: i endUpdates są zazwyczaj w różnych metod delegata. Co można zrobić potem jest

  1. dodać obiekt insertedIndexPath przechowywać włożonej ścieżka zaindeksowały
  2. po wywołaniu w -controller:didChangeObject:atIndexPath:-insertRowsAtIndexPaths:withRowAnimation: dodać

    self.insertedIndexPath = insertedIndexPath; 
    
  3. po [self.tableView endUpdates] w -controllerDidChangeContent:, dodać

    if (self.insertedIndexPath) { 
        [self.tableView scrollToRowAtIndexPath:self.insertedIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
        self.insertedIndexPath = nil; 
    } 
    
+0

dzięki @tammo! To działało idealnie! – djblue2009

+0

Tworzenie właściwości o nazwie "newIndexPath" wygeneruje błąd kompilacji: 'Właściwość podąża za konwencją nazewnictwa Cocoa dotyczącą zwracania" posiadanych "obiektów' Po prostu nadaj tej właściwości coś innego:] –

+0

: D Zostało to napisane w czasie, gdy kompilator nie narzekał na to. Zmienię 'newIndexPath' na' insertedIndexPath'. –

0

Zobacz, czy to pomaga ...

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

[self.tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];