2013-03-05 10 views
13

Próbowałem napisaćJak wybrać niektóre elementy w UICollectionView po pierwszym załadowaniu?

[self collectionView:myCollectionView didSelectItemAtIndexPath:selectedIndexPath]

i UICollectionViewCell na wybrany = TAK w viewDidLoad, i to nie wdrożył metodę didSelectItemAtIndexPath, ale komórka nie wybiera.

Napisałem wybrany stan w podklasie UICollectionViewCell (void)setSelected:(BOOL)selected. Po załadowaniu widoku działa ręczna funkcja wyboru. Ale nie mogłem pozwolić, by auto wybrało niektóre elementy po pierwszym załadowaniu widoku.

Próbowałem pisać kody:

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

i

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath, nie wszystko OK.

I okazało się, że pierwszy bieg viewDidLoad i didSelectItemAtIndexPath, następnie cellForItemAtIndexPath, wydaje się, że mogłyśmy dostać komórkę w indexPath (to wiem) przed cellForItemAtIndexPath, bo wcześniej, że komórka nie istnieje. Jak więc wybrać niektóre elementy w UICollectionView po pierwszym załadowaniu?

Przepraszamy za mój słaby angielski. Z góry dziękuję.

Odpowiedz

11

Nie jestem pewien, czy mam twoje pytanie poprawne, ale tutaj jest możliwe rozwiązanie:

Na przykład viewWillAppear: zrobić

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

pamiętać, że nazywając „selectItemAtIndexPath” programowo nie wywołuje odpowiednich metod delegata; będziesz musiał zadzwonić do nich w kodzie, jeśli ich potrzebujesz.

+2

Dziękujemy! Rozpracowałem to! Zawsze użyłem niewłaściwego kodu: [self collectionView: _tagsCollectionView didSelectItemAtIndexPath: selectedIndexPath] i próbowałem umieścić go wszędzie, a nie w selekcji selectItemAtIndexPath, więc zawsze nie działa. – zgjie

+0

Po załadowaniu mojego widoku ta metoda działa dobrze dla mnie. Ale moim zdaniem mam kciuki, które są wybierane automatycznie – bashan

+0

I jaki jest dokładnie twój problem? Pierwotne pytanie dotyczyło pierwszego obciążenia widoku. – SAE

8

W moim przypadku selectItemAtIndexPath miał żadnego wpływu po reloadData, więc musiałem zadzwonić go w bloku ukończenia performBatchUpdates:

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

let indexPath = ... 

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

Dzięki. Byłem w tej samej sytuacji, gdy wykonałem akcję selectItem po ponownym załadowaniu danych. Twoja odpowiedź rozwiązała mój problem. –

4

Swift 3

Wdrożenie tej funkcji nadpisywania gdzie jest Twój CollectionView jest tworzony . Zakładając, że mamy 1 sekcję 1 wiersza, takich jak historie na Instagramie.

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)) 
     } 
    } 
Powiązane problemy