2013-01-23 15 views
24

Mam wiele elementów w CollectionView, ale tylko kilka z nich powinny być do wyboru. Mam obsługi tego metodą Delegat:UICollectionView shouldSelectItemAtIndexPath = NO nie uniknie odznaczenia starego zaznaczenia?

- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath 

Mój problem występuje, jeśli zostanie wybrana pozycja wybierana w następnym etapie dobór nie wybieranej pozycji zostały odrzucone przez shouldSelectItemAtIndexPath powrocie NO, wybrana pozycja zostanie zaznaczona tak czy inaczej.

Próbowałem również użyć

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath 

Ale to jest ten sam problem.

Czy jest to prawidłowe pożądane zachowanie UICollectionView? A jeśli tak, jak mogę uniknąć cofnięcia wyboru ostatnio wybranego elementu, jeśli wybrany zostanie element nie do wyboru?

Odpowiedz

11

Muszę poprawić moje założenie: Ostatni wybór nie zostanie odznaczony!

Aby zmienić wygląd komórki po zaznaczeniu, zastąpiłem parametr setSelected z UICollectionViewCell. Po wybraniu elementu, którego nie można wybrać, akcelerator setSelected z ostatnio wybranej komórki jest wywoływany wiele razy. Najpierw ze stanem NIE, następnie ze stanem TAK, a na koniec z NIE. Ostatni stan NIE spowodował, że moja komórka ustawiła swój wygląd na komórkę inną niż wybrana.

Nie znam przyczyny tego dziwnego zachowania ani nie mogłem go rozwiązać.

Moje obejście problemu służy do zmiany wyglądu wybranych komórek bezpośrednio w ViewController.

Ustaw wybrany wygląd w:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

Usuń wybrany wygląd:

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath 

Sprawdź, czy wybrana jest bieżąca komórka i zmienić wygląd zgodnie z przeznaczeniem.

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

Czy próbowałeś:

- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath 

Okazało się, że to działa zgodnie z oczekiwaniami.

+0

ta metoda działa tylko dla wielu wyborów –

1

Powinieneś zmienić wygląd komórki w metodzie delegowanych metod DidSelect i DidDeselect. Jeśli zwrócisz NIE w metodzie shouldSelect, DidSelect i DidDeselect nie będą wywoływane, więc wygląd pozostanie taki sam, zgodnie z wybranym stanem collectionView.

0

Nie wiem, dlaczego UICollectionView jest tak brudny jak ten w porównaniu do UITableViewController ... Kilka rzeczy dowiedziałem się.

Powodem, dla którego - setSelected: zostaje wywołany wiele razy, jest wywołanie metod sekwencji.Sekwencja jest bardzo podobna do tej z metod UITextFieldDelegate.

Metoda - collectionView:shouldSelectItemAtIndexPath: jest wywoływana zanim collectionView faktycznie wybiera komórkę, ponieważ faktycznie pyta "czy powinna być wybrana"?

- collectionView:didSelectItemAtIndexPath: jest w rzeczywistości wywoływana po tym, jak collectionView wybiera komórkę. Stąd nazwa "wybrał".

To samo dotyczy cofnięcia wyboru.

TL; DR - Odłóż komórkę w trybie delegata pod numer - collectionView:shouldSelectItemAtIndexPath:, dzwoniąc pod numer - selectItemAtIndexPath:animated:scrollPosition:, a wszystko będzie dobrze.

0

Po prostu miałem ten sam problem. Próbowałem różnych rozwiązań, a pierwszym, który działał w moim przypadku było ponowne załadowanie, a następnie ponowne zaznaczenie wybranych komórek. To działało dla mnie, czy przeładowałem cały widok kolekcji, czy tylko komórki, które utknęły w niewybranym wyglądzie.

Podejścia, które nie działają na mnie:

  • zachodzącego komórki selected właściwość true, lub nawet przełączenie to fałszywa wtedy prawdziwe ponownie.
  • Wybór pozycji poprzez -selectItemAtIndexPath:animated:scrollPosition:, a nawet usunięcie zaznaczenia za pomocą -deselectItemAtIndexPath:, a następnie ponowne jej wybranie.
  • Ponowne załadowanie tylko wybranych wierszy za pomocą -reloadItemsAtIndexPaths:
  • Ponowne ładowanie wszystkiego za pomocą -reloadData.
0

Rozwiązałem to, ustawiając self.collectionView.allowsMultipleSelection = true.

A odznaczając każdy indeks Kiedy wróciłem prawda do -collectionView:shouldSelectItemAtIndexPath: