Dopo aver chiamato -[UICollectionView reloadData]
ci vuole un po 'di tempo per la visualizzazione delle celle, quindi selezionare un elemento immediatamente dopo aver chiamato reloadData
non funziona. C'è un modo per selezionare un elemento immediatamente dopo reloadData
?uicollectionview seleziona un elemento immediatamente dopo il ricaricamento?
risposta
Lungo le linee di this answer ho trovato che chiamare layoutIfNeeded
dopo reloadData
sembrava effettivamente 'a filo' la ricarica prima di fare altre cose per la CollectionView:
[self.collectionView reloadData];
[self.collectionView layoutIfNeeded];
...
Nella pagina ho trovato questa soluzione, alcuni commentatori hanno indicato che non funziona per loro su iOS 9, ma per me va bene così il tuo chilometraggio può variare.
creare un metodo che esegue la selezione e chiamarlo utilizzando performSelector dopo aver chiamato reload.g.g;
Non mi piace questa soluzione perché richiede una quantità di tempo arbitraria. Come potremmo sapere quando '' 'reloadData''' è finito? Sembra che non ci sia modo di interrogarlo. – mjh
Assicurati di chiamare reloadData
sul thread principale. Questa potrebbe essere la causa del ritardo nei tuoi aggiornamenti cellulari.
E [la risposta a questa domanda] (http://stackoverflow.com/questions/14804359/uicollectionview-doesnt-update-immediately-when-calling-reloaddata-but-randoml) mostra come farlo. – Jeff
Sto gestendo la selezione di celle in collectionView: cellForItemAtIndexPath:
. Il problema che ho riscontrato è che se la cella non esisteva, chiamare semplicemente selectItemAtIndexPath: animated: scrollPosition:
in realtà non selezionava l'elemento.
Invece si hanno a che fare:
cell.selected = YES;
[m_collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];
Non utilizzare reloadData
Usa - (void)performBatchUpdates:(void (^)(void))updates completion:(void (^)(BOOL finished))completion
invece. Il blocco di completamento viene eseguito dopo che le animazioni per l'inserimento/la cancellazione delle celle, ecc. Sono state completate. Si può mettere la chiamata a reloadData nel blocco (void (^)(void))updates
Quando UICollectionView ha molti elementi, ho riscontrato ENORME problemi di prestazioni con le chiamate di aggiornamento animate rispetto a reloadData. –
Apple dice:
Non si dovrebbe chiamare questo metodo nel mezzo di blocchi di animazione in cui gli elementi vengono inseriti o cancellati. Inserimenti e cancellazioni causano automaticamente l'aggiornamento dei dati della tabella in modo appropriato.
In realtà, non si dovrebbe chiamare questo metodo nel mezzo di un'animazione (compreso lo UICollectionView
nello scorrimento).
Quindi, è possibile utilizzare:
[self.collectionView setContentOffset:CGPointZero animated:NO];
[self.collectionView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
o contrassegnare sicuri di non qualsiasi animazione, e quindi chiamare reloadData
; o
[self.collectionView performBatchUpdates:^{
//insert, delete, reload, or move operations
} completion:nil];
Spero che questo è utile a voi.
L'ho gestito sul delegato colelctionView di willDisplayCell. L'idea: una variabile temporanea è necessaria per specificare lo scorrimento iniziale già eseguito o meno (scrollIsRequired). Quando verrà visualizzata l'ultima cella visibile, possiamo scorrere fino alla cella richiesta e impostare questa variabile per evitare di scorrere di nuovo.
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{
//Perform any configuration
if (CGRectGetMaxX(collectionView.frame) <= CGRectGetMaxX(cell.frame)) {
// Last visible cell
if (self.scrollIsRequired) {
[self.collectionView selectItemAtIndexPath:[NSIndexPath indexPathForItem:self.initiallySelectedRepresentativeVerse inSection:0] animated:YES scrollPosition:UICollectionViewScrollPositionLeft];
self.scrollIsRequired = NO;
}
}
}
Ha funzionato per me come un fascino.
Il modo Swift:
let selected = collectionView.indexPathsForSelectedItems()
collectionView.performBatchUpdates({ [weak self] in
self?.collectionView.reloadSections(NSIndexSet(index: 0))
}) { completed -> Void in
selected?.forEach { [weak self] indexPath in
self?.collectionView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: [])
}
}
Questo è ciò che ha funzionato per me:
ho mantenuto un punto di riferimento del percorso di selezionare l'indice e overide la funzione reloadData:
override func reloadData() {
super.reloadData()
self.selectItem(at: self.selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition())
}
Ho provato a fare usando indexPathForSelectedItems, ma è stato la creazione di un infinito loop su caricamento vista raccolta.
- 1. Il ricaricamento di un UICollectionView utilizzando il metodo reloadData ritorna immediatamente prima del ricaricamento dei dati
- 2. XPath - Seleziona il primo elemento dopo qualche altro elemento
- 3. SELEZIONA quindi elimina immediatamente il record mysql
- 4. ExecuteScalar restituisce immediatamente dopo SELECT?
- 5. Ottenere immediatamente il primo elemento figlio
- 6. Ricaricamento UITableViewCell personalizzato dopo il riordinamento delle celle
- 7. Come forzare il ricaricamento del client dopo la distribuzione?
- 8. Jsoup seleziona il testo dopo il tag
- 9. Seleziona elementi casella e: dopo
- 10. UICollectionView visualizza solo il primo elemento dal set di dati
- 11. Seleziona il primo elemento visibile nel goniometro
- 12. ListBox seleziona sempre automaticamente il primo elemento
- 13. Come eliminare un elemento dalla UICollectionView con indexpath.row
- 14. Ricaricamento di un ViewController
- 15. JQuery seleziona un elemento all'interno di td
- 16. Seleziona elemento specifico prima di un altro elemento
- 17. jQuery: aggiungi elemento dopo un altro elemento
- 18. SQL SELEZIONA tutto dopo un determinato carattere
- 19. javascript - elementFromPoint seleziona elemento inferiore
- 20. Chiamare il metodo virtuale immediatamente dopo la costruzione
- 21. Problema con ManyToMany Relazioni non aggiornate immediatamente dopo il salvataggio
- 22. Arresto dell'app iPhone immediatamente dopo l'aggiornamento
- 23. Accesso a $ _COOKIE immediatamente dopo setcookie()
- 24. Google PlacePicker chiude immediatamente dopo il lancio con resultCode 2
- 25. PlacePicker.IntentBuilder si chiude immediatamente dopo l'apertura
- 26. UICollectionView reloadSections con animazione
- 27. LINQ: Seleziona tutto da ogni gruppo, tranne il primo elemento
- 28. Posso chiamare CloseHandle() immediatamente dopo _beginthreadex() riuscito?
- 29. Come comprimere completamente un SearchView dopo un elemento selezionato?
- 30. Come selezionare alcuni elementi in UICollectionView dopo il primo caricamento?
Eventuali aggiornamenti su questo? Ho lo stesso problema, cercando di creare una selezione durante il caricamento di UICollectionView. –