2012-09-30 12 views
9

Potwierdzam, że funkcja UITableview ładuje dynamicznie komórkę, gdy użytkownik przewija. Zastanawiam się, czy istnieje sposób wstępnego ładowania wszystkich komórek, aby nie ładować każdego podczas przewijania. Muszę wstępnie załadować 10 komórek. czy to możliwe?Wstępnie załaduj komórki uitableview

Odpowiedz

11

Można zainicjować komórki widoku tabeli, umieścić je w tablicy precomputedCells, a w trybie delegowania źródła danych tableView:cellForRowAtIndexPath: zwrócić wstępnie obliczone komórki z tablicy zamiast wywoływać dequeueReusableCellWithIdentifier:. (Podobny do tego, co byś zrobił w statycznym widoku tabeli.)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [self.precomputedCells objectAtIndex:indexPath.row]; 
} 

To może również być przydatne do obejrzenia WWDC 2012 Session 211 „budynek Concurrent interfejsów użytkownika w systemie iOS” gdzie jest ono pokazane jak wypełnić zawartość komórek widoku tabeli w wątkach w tle, zachowując jednocześnie responsywność interfejsu użytkownika.

+0

Jak pan powiedział, że uratował moje komórki do NSMutableArray. Następnie ładuję je jeden po drugim za pomocą [self tableView: tablefollow cellForRowAtIndexPath: indexPath1]; . Widoczny widok nie jest widoczny podczas ładowania wstępnego. Po widocznym widocznym widoku zauważam, że NSString * CellIdentifier = [NSString stringWithFormat: @ "Cell% i-% i", indexPath.section, [indexPath row]]; UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; daje mi zero! Jak mogę rozwiązać ten problem? Sądzę, że jest tak, ponieważ uitableview nie jest widoczny podczas wstępnego ładowania komórek. Czy mam rację? – stefanosn

+0

@stefanosn: Mój pomysł polegał na tym, aby w ogóle nie używać 'dequeueReusableCellWithIdentifier'. Odpowiednio zaktualizowałem odpowiedź. - * Możliwe, że źle zrozumiałem twoje pytanie *. Nie sądzę, że można zmusić widok tabeli do rzeczywistego * załadowania * wszystkich komórek. Nawet jeśli wywołasz '[self tableView: ... cellForRowAtIndexPath: ...];' dla wszystkich komórek, widok tabeli może odrzucić nieużywane komórki. Możesz * wstępnie obliczać * wszystkie komórki (tak jak opisano w mojej odpowiedzi), aby ładowanie każdej komórki odbywało się szybciej. - Mam nadzieję, że to pomoże. –

+0

Myślałem o preloading komórek na uitableview, tak że nie muszę zwracać komórki w - (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath w celu poprawy przewijania. Więc nie jest to możliwe, prawda? – stefanosn

0

Zmiana dequeueReusableCellWithIdentifier gdy jesteś ponowne wykorzystanie widok tabeli inaczej będzie załadować stare dane

9

szukałem rozwiązania pierwotnego pytania, a ja myślałem, że dzielę rozwiązanie.

W moim przypadku wystarczy wczytać następną komórkę (nie będę wdawał się w powód dlaczego, ale był dobry powód).

Wygląda na to, że UITableView wyświetla tyle komórek, ile zmieści się w przypisanej do niego ramce UITableView.

W związku z tym przewymiarowałem ramkę UITableView o wysokość 1 dodatkowej komórki, przesuwając poza obszar ponadwymiarowy (lub, jeśli to konieczne, mógł zostać przycięty UIView). Oczywiście oznaczałoby to teraz, że po przewinięciu widoku tabeli ostatnia komórka nie byłaby widoczna (ponieważ ramka UITableView jest większa niż jej widok). Dlatego dodałem dodatkowe UIView do tableFooterView wysokości komórki. Oznacza to, że kiedy stół przewija się do dołu, ostatnie komórki ładnie spoczywają na dole jego widoku, podczas gdy dodana tabela FooterView pozostaje poza ekranem.

Można to oczywiście zastosować do dowolnej liczby komórek. Powinno być możliwe zastosowanie go do wstępnego załadowania WSZYSTKICH komórek w razie potrzeby przez przewymiarowanie ramki UITableView do contentSize iOS pierwotnie oblicza, a następnie dodanie tableFooterView o tym samym rozmiarze.

Mam nadzieję, że pomoże to komuś z tym samym problemem.

+0

To wygląda ładnie. Niestety nie działa z tabelami stronicowanymi. –

+0

Kluczem wstępnego ładowania komórek jest Twoje rozwiązanie! –

+0

Jest to jedyne rozwiązanie, do dnia dzisiejszego. Chociaż jest to dobry pomysł, jeśli wiesz, że wysokość widoku tabeli lub kolekcji nie będzie zbyt duża, w przeciwnym razie wystąpią problemy z pamięcią i wydajnością. –

1

Zgodnie z sugestią Marka I również tymczasowo zmieniłem wysokość mojego interfejsu UITableView, tak aby widok tabeli tworzył wystarczającą liczbę komórek do ponownego użycia. Następnie resetuję wysokość widoku tabeli, aby przestać tworzyć komórki do ponownego użycia podczas przewijania.

Aby osiągnąć cel, który tworzę bool pomocnika, który jest ustawiony domyślnie na false:

var didPreloadCells = false 

jest ustawiona na true, kiedy mój widok tabeli pierwszej reloaded danych i dlatego stworzył pierwsze wielokrotnego użytku komórki.

resultsHandler.doSearch { (resultDict, error) -> Void in 
    [...] 

    self.tableView.reloadData() 

    self.didPreloadCells = true 

    [...] 
} 

Prawdziwa sztuczka ma miejsce w mojej metodzie viewDidLayoutSubviews. Tutaj ustawiam ramkę mojego widoku tabeli w zależności od mojej wartości boolowskiej. Jeśli komórki wielokrotnego użytku nie zostały jeszcze utworzone, zwiększam ramkę widoku tabeli.W innym przypadku ustawić normalnej ramki

override func viewDidLayoutSubviews() { 

    super.viewDidLayoutSubviews() 

    self.tableView.frame = self.view.bounds 

    if !didPreloadCells 
    { 
     self.tableView.frame.size.height += ResultCellHeight 
    } 
} 

Z pomocą tego widzenia tabeli tworzy więcej początkowych komórek wielokrotnego użytku niż normalnie i przewijanie jest gładka i płynna, ponieważ żadne dodatkowe komórki muszą być tworzone.

-2

Rozwiązanie do automatycznego modelowania komórek. Zmień „estimatedRowHeight” do niższej wartości

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.tableView.rowHeight = UITableViewAutomaticDimension; 
    self.tableView.estimatedRowHeight = 32; //Actual is 64 
} 

Rzeczywista wysokość szacowana jest 64. 32 służy do dodawania więcej komórek do ponownego użycia, aby uniknąć w tyle podczas przewijania zaczyna

Powiązane problemy