2013-03-23 15 views
5

Mam aplikację IOS, która używa UICollectionView do wyświetlania poziomej siatki komórek. Wszystko, czego potrzebuję, to sprytny sposób (leniwego) ładowania danych, gdy użytkownik dojdzie do końca mojego UICollectionView. Kod używam teraz:Leniwa technika ładowania dla UICollectionView

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    GridCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:Cell forIndexPath:indexPath]; 


    /** 
    TODO 
    - Find a good way to check if the user has reach the end of the grid 
    - This next piece of code is for demonstration purposes. A real check has to be 
    done yet!!! 
    **/ 

    // releases is my datasource // 

    if(indexPath.row == (releases.count - 1)) { 
     [self getNextListData]; 
    } 

    return cell; // <-- finally return the cell 


} 

Problem z tym kodem jest: Jeżeli użytkownik przewija się bardzo szybko do końca, ma on do przewijania w przód iw tył, aby załadować więcej rzeczy. To naprawdę nie jest przyjazne dla użytkownika i potrzebuję lepszego sposobu na załadowanie przedmiotów w razie potrzeby.

Czy ktoś ma jakieś sugestie?

Z góry dziękuję.

+0

Zakładam, że nie znasz liczby na liście, czy tak jest w tym przypadku? – gaige

Odpowiedz

2

Po napotkaniu tego problemu z widokami tabel musiałem przeprowadzić pewne testy użytkowników. Odkryłem, że jeśli zacznę ładować 10 komórek przed końcem tabeli, nowa komórka powinna być gotowa. Zakładając, że robisz ładowanie danych w tle, to znaczy.

if (indexPath.row >= [releases count] - 10) 
    [self getNextListData]; 

Chciałbyś zrobić kilka testów, aby sprawdzić, jaki numer działa dla Ciebie.

Ponadto miałem również komórkę wskaźnika ładowania. W mojej liczbie wierszy w sekcji wywołania zwrotnego zawsze zwracałem 1 dodatkowy.

return [releases count] + 1; 

Na początku mojej komórki dla oddzwonienia wierszem zwróciłem specjalną komórkę wskaźnika ładowania.

if (indexPath.row == [releases count]) 
    return [JLTActivityCell sharedInstance]; 

Nie jestem pewien, jak dokładnie ta opinia będzie miała zastosowanie do widoków kolekcji, ale mam nadzieję, że to pozwoli ci wskazać dobry kierunek.

5

UICollectionView dziedziczy po UIScrollView. UIScrollView ma delegata, UIScrollViewDelegate, który ma kilka metod związanych z przewijaniem. W jednej z tych metod delegowania (takich jak scrollViewDidBeginDecelerating:) możesz sprawdzić, jak daleko wzdłuż strony jesteś, z właściwościami contentOffset i contentSize. Jeśli jesteś blisko końca (zdefiniowanego przez%, który jest dla ciebie końcem), pobierz więcej danych.

Zaletą używania metody przewijania jest to, że nie spowoduje ona spowolnienia pracy (zmuszając ją do niepotrzebnego uruchamiania kodu dla każdego wyświetlenia kolekcji).

Jest to w zasadzie ta sama technika, którą Apple sugeruje do leniwego ładowania danych UITableView, zastosowanych nieco inaczej. Mają również przykładowy kod (taki jak LazyTableImages)

Powiązane problemy