2016-02-21 11 views
5

byłem walić głową o ten problem przez kilka godzin, ale za każdym razem, gdy próbuję coś takiego:Dlaczego funkcja InsertRowsAtIndexPath zawsze powoduje przewijanie TableView do góry?

self.dataArray.append(newCellObj) 

a następnie zrobić to:

self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

UITableView automatycznie przewiń do u góry strony.

Nawet jeśli próbuję:

self.tableView.scrollEnabled = false 
    self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

UITableView nadal będzie przewinąć do góry nawet przewijanie całkowicie wyłączona. Co dokładnie powoduje przewinięcie ScrollView do góry po wywołaniu insertRowsAtIndexPaths?

Jedynym rozwiązaniem mam tego problemu jest użycie w tym:

self.tableView.reloadData() 

zamiast. Jeśli użyję zamiast tego opcji reloadData, to jest to w porządku, ale potem tracę fajną animację, którą chciałbym zachować.

Mam też self.tableView.scrollsToTop = false i próbowałem wielu innych konfiguracjach, jak to, które mogłyby wyłączyć przewijanie w jakiś sposób, ale jest coś, co zastąpi to po insertRowsAtIndexPaths

+3

Myślę, że możesz mieć tutaj trochę inny kod reagujący słabo. Masz rację, że nie powinno się przewijać do góry. Czy próbowałeś to zrobić, nie będąc pomiędzy aktualizacjami początku/końca? Czy istnieje inny kod, który * może * być istotny? –

+1

@RyanPoolos Dzięki mate, działa lepiej bez aktualizacji początku/końca dla mnie. : D –

Odpowiedz

12

byłem napotykają ten sam problem jak OP. Dodatkowo czasami niektóre z moich komórek widoku tabeli były "puste" i znikały całkowicie, co doprowadziło mnie do this related question.

Dla mnie rozwiązaniem było wykonać jedną z następujących czynności:

  • wdrożyć func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
  • wyłączyć układ automatycznego
  • ustawić dokładniejsze estimatedRowHeight na moim UITableView
+3

DZIĘKUJEMY! Wydaje się, że "estimatedHeightForRowAtIndexPath" całkowicie rozwiązało problem! Wydaje się, że jest to bardziej "maksymalna wysokość dla wiersza na ścieżce indeksu", kiedy ustawię tę wartość na coś o wiele za wysoko niż średnia komórka w moim tableView, wydaje się, że to się udało. Byłem też w stanie utrzymać włączony "układ automatyczny"! : D Mam kilka tych funkcji "widoku tabeli aktualizacji" w całym moim projekcie, każdy zajmuje się zupełnie inną klasą komórek, a sztuczka szacunkowej wysokości naprawia każdą z nich. Alternatywą dla tego, jak sądzę, jest ręczna heightForRowAtIndexPath. – Mateusz266

+2

Jesteś legendą !!! Dziękuję bardzo!!! – Gix

+0

Mam ten sam problem, ale 'estimHeightForRowAtIndexPath' i' estimatedRowHeight' nie działa. – lee

0
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 

// I'm use auto layout and this variant without animation works 
// ...insert object to datasource 
NSUInteger idx = [datasource indexOfObject:myNewObject]; 
if (NSNotFound != idx) 
{ 
    NSIndexPath *path = [NSIndexPath indexPathForRow:idx inSection:0]; 
    [self.table beginUpdates]; 
    [self.table insertRowsAtIndexPaths:@[path] 
         withRowAnimation:UITableViewRowAnimationNone]; 
    [self.table endUpdates]; 
    [self.table scrollToRowAtIndexPath:path 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:NO]; 
} 
Powiązane problemy