2013-03-05 11 views
13

Ho cercato di scrivereCome selezionare alcuni elementi in UICollectionView dopo il primo caricamento?

[self collectionView:myCollectionView didSelectItemAtIndexPath:selectedIndexPath]

e UICollectionViewCell di selezionato = YES nel viewDidLoad, ed ha implementato il metodo didSelectItemAtIndexPath, ma la cella non selezionata.

Ho scritto lo stato selezionato nella sottoclasse UICollectionViewCell (void)setSelected:(BOOL)selected. Dopo aver caricato la vista, la funzione di selezione manuale funziona. Ma non potevo lasciarlo selezionare automaticamente alcuni elementi dopo il primo caricamento della vista.

E ho provato a scrivere codici in:

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

e

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath, non tutto OK.

l'ho trovato prima esecuzione viewDidLoad e didSelectItemAtIndexPath, poi cellForItemAtIndexPath, sembra che io potuto't ottenere la cella nella indexPath (che io sappia) prima cellForItemAtIndexPath, perché prima che la cella non è esiste. Quindi, come selezionare alcuni elementi nello UICollectionView dopo il primo caricamento?

Ci scusiamo per il mio povero inglese. Grazie in anticipo.

risposta

11

Non è sicuro, se ottenuto il vostro domanda corretta, ma ecco una possibile soluzione:

In es viewWillAppear: fare

[self.collectionView reloadData]; 
NSIndexPath *selection = [NSIndexPath indexPathForItem:THE_ITEM_TO_SELECT 
              inSection:THE_SECTION]; 
[self.collectionView selectItemAtIndexPath:selection 
            animated:YES 
          scrollPosition:UICollectionViewScrollPositionNone]; 

Tenete a mente, che chiamare 'selectItemAtIndexPath' a livello di codice non chiama i relativi metodi delegato; dovrai chiamarli in codice se ne hai bisogno.

+2

Grazie! Ho lavorato fuori! Ho sempre usato il codice sbagliato: [self collectionView: _tagsCollectionView didSelectItemAtIndexPath: selectedIndexPath] e ho provato a metterlo ovunque, non in selectItemAtIndexPath, quindi non sempre funziona. – zgjie

+0

Quando la mia vista è caricata questo metodo funziona bene per me. Ma a mio avviso ho i pollici che vengono selezionati automaticamente – bashan

+0

E qual è esattamente il tuo problema? La domanda originale riguardava il primo caricamento della vista. – SAE

8

Nel mio caso selectItemAtIndexPath avuto alcun effetto dopo reloadData, così ho dovuto chiamare nel blocco completamento del performBatchUpdates:

collectionView.dataSource = ... 
collectionView.delegate = ... 

let indexPath = ... 

collectionView.performBatchUpdates(nil) { _ in 
    collectionView.selectItemAtIndexPath(indexPath, animated: false, scrollPosition: .None) 
} 
+0

Grazie. Ero nella stessa situazione di fare un'azione SelectItem dopo reloadData. La tua risposta ha risolto il mio problema. –

4

Swift 3

implementare questa funzione di esclusione in cui viene creato l'CollectionView . Supponendo che abbiamo 1 sezione 1 riga come storie di Instagram.

override func viewDidAppear(_ animated: Bool) { 
     // Auto Select First Item 
     self.myCollectionView.performBatchUpdates(nil) { _ in 
      self.myCollectionView.selectItem(at: IndexPath(item: 0, section: 0), animated: false, scrollPosition: [.centeredHorizontally]) 
      self.collectionView(self.myCollectionView, didSelectItemAt : IndexPath(item: 0, section: 0)) 
     } 
    }