2013-03-23 8 views
5

Ho un'applicazione IOS che utilizza UICollectionView per visualizzare una griglia di celle orizzontale. Tutto ciò di cui ho bisogno è un modo intelligente di (lazy) caricamento dei dati quando l'utente raggiunge la fine del mio UICollectionView. Il codice che uso ora è:Tecnica di caricamento lenta per 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 


} 

Il problema con questo codice è: se un utente scorre veramente veloce fino alla fine, deve scorrere avanti e indietro per caricare più elementi. Questo non è davvero facile da usare e ho bisogno di un modo migliore per caricare gli articoli quando necessario.

Qualcuno ha qualche suggerimento?

Grazie in anticipo.

+0

Suppongo che tu non conosca il conteggio nella lista per cominciare, è questo il caso? – gaige

risposta

2

Quando mi sono imbattuto in questo problema con le visualizzazioni di tabella, ho dovuto eseguire alcuni test utente. Ho scoperto che se avessi iniziato a caricare 10 celle prima della fine della tabella, la nuova cella dovrebbe essere pronta. Supponendo che stai facendo il caricamento in background dei dati, cioè.

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

Si vorrebbe fare qualche test per vedere quale numero funziona per voi.

Inoltre, ho anche una cella indicatore di caricamento. Nel mio numero di righe nella sezione callback, ho sempre restituito 1 extra.

return [releases count] + 1; 

All'inizio della mia cella per la richiamata di righe ho restituito una cella indicatore di caricamento speciale.

Non sono sicuro del modo in cui tale consiglio si applicherà alle viste di raccolta, ma si spera che ciò ti porti in una buona direzione.

5

UICollectionView eredita da UIScrollView. UIScrollView dispone di un delegato, UIScrollViewDelegate che ha una serie di metodi correlati allo scorrimento. In uno di questi metodi delegati (ad esempio scrollViewDidBeginDecelerating:), è possibile controllare per vedere fino a che punto si trova la pagina, con le proprietà contentOffset e contentSize. Se sei vicino alla fine (definito da qualunque sia% la tua fine), scarica più dati.

Un vantaggio dell'utilizzo di un metodo scrollview è che non causerà il minor numero di collectionView:cellForItemAtIndexPath: (forzandolo a eseguire il codice per ogni raccolta non necessaria).

Questa è fondamentalmente la stessa tecnica suggerita da Apple per il caricamento lento dei dati di UITableView, applicato in modo leggermente diverso. Hanno anche qualche codice di esempio (come LazyTableImages)

Problemi correlati