2013-06-18 16 views
5

Sto cercando di memorizzare un indice per un oggetto (indexPath.item) in un UICollectionView e in un secondo momento, dopo che la vista è stata sostituita e quindi ripristinata, per scorrere fino a quell'elemento memorizzato.UICollectionView Scorrimento a un articolo

Quando si memorizza la voce, indexPath, e indexPath.item sono:

indexPath is: <NSIndexPath 0x1d87b380> 2 indexes [0, 32] 
indexPath.item is: 32 

Quando ricalcolare l'indexPath tardi per quella voce, indexPath, e indexPath.item sono:

indexPath is: <NSIndexPath 0x1d8877b0> 2 indexes [0, 32] 
item is: 32 

provo per scorrere fino alla posizione memorizzata utilizzando:

NSIndexPath *iPath = [NSIndexPath indexPathForItem:i inSection:0]; 
[self collectionView scrollToItemAtIndexPath:iPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; 

Ho ricevuto un errore:

attempt to scroll to invalid index path 
+3

Stampa il percorso dell'indice che stai cercando di raggiungere nel messaggio di errore? Se lo fa, ed è, diciamo, '[sezione, riga]'. Prova a 'NSLog'' [self.collectionView numberOfItemsInSection: section]; e facci sapere – micantox

+1

Grazie micantox. Il numero di stampa di ItemsInSection ha rivelato che la visualizzazione utilizzata per lo scorrimento era obsoleta. Quando ho usato lo scrollToItemAtIndexPath dopo aver aggiornato la vista, ha funzionato! – kzia

+1

ti sei dimenticato di mettere un punto? e "[self.collectionView scroll ..." non "[self collectionView scroll ..." (si noti un punto tra self e collectionView)? Sembra che il messaggio di errore indichi esattamente questo problema – igrek

risposta

2

Il numero di stampa di ItemsInSection ha rivelato che la visualizzazione utilizzata per lo scorrimento era obsoleta. Quando ho usato lo scrollToItemAtIndexPath dopo aver aggiornato la vista, ha funzionato!

10

si chiama [self.collectionView reloadData]; prima di provare a scorrere fino alla indexPath?

Se si desidera spostare l'indexPath quando finisce il reloadData, inserire il codice in un blocco come questo:

[UIView animateWithDuration:0 
     animations: ^{ [self.collectionView reloadData]; } 
     completion:^(BOOL finished) { 
         NSIndexPath *iPath = [NSIndexPath indexPathForItem:i inSection:0]; 
         [self collectionView scrollToItemAtIndexPath:iPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; 
}]; 

Prima di chiamare scrollToItemAtIndexPath, si potrebbe anche verificare il numero di elementi nella sezione per assicurarsi i è valido, o otterrai lo stesso errore.

+1

Ancora mi ha dato lo stesso errore. –

Problemi correlati