it-swarm.com.de

UICollectionView shouldSelectItemAtIndexPath = NO umgeht nicht die Abwahl der alten Auswahl?

Ich habe mehrere Elemente in einer Sammlungsansicht, aber nur einige davon sollten auswählbar sein. Ich behandle das mit der Delegate-Methode:

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

Mein Problem tritt auf, wenn ein auswählbares Element ausgewählt wird und im nächsten Schritt die Auswahl eines nicht auswählbaren Elements von shouldSelectItemAtIndexPath mit der Rückgabe von NO abgelehnt wird. Das ausgewählte Element wird trotzdem abgewählt.

Ich habe auch versucht, zu verwenden

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

Aber es ist das gleiche Problem.

Ist dies das richtige gewünschte Verhalten von UICollectionView? Und wenn ja, wie kann ich die Abwahl meines zuletzt ausgewählten Elements vermeiden, wenn ein nicht auswählbares Element ausgewählt wird?

28
sust86

Ich muss meine Annahme korrigieren: Die letzte Auswahl wird nicht abgewählt!  

Um das Aussehen der Zelle bei der Auswahl zu ändern, habe ich den setSelected-Accessor von UICollectionViewCell überschrieben. Wenn Sie ein nicht auswählbares Element auswählen, wird der ZugriffssetSelected der zuletzt ausgewählten Zelle mehrmals aufgerufen. Zuerst mit dem Status NO, dann mit dem Status YES und zuletzt mit NO. Der letzte Zustand NO veranlaßte meine Zelle, ihr Erscheinungsbild auf das einer nicht ausgewählten Zelle zu setzen.

Ich kenne den Grund für dieses komische Verhalten nicht und könnte es auch nicht lösen.

Mein Workaround soll das Aussehen ausgewählter Zellen direkt im ViewController ändern.

Setze das ausgewählte Aussehen in:

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

Entferne das ausgewählte Erscheinungsbild:

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

Überprüfen Sie, ob die aktuelle Zelle ausgewählt ist, und ändern Sie das Erscheinungsbild wie beabsichtigt.

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

Ich habe das Problem gelöst, indem Sie self.collectionView.allowsMultipleSelection = true eingestellt haben.

Und alle Indexe abwählen, wenn ich true an -collectionView:shouldSelectItemAtIndexPath: zurückgegeben habe

1
Gustavo Vergara

Sie sollten das Aussehen der Zellen in der Delegate-Methode DidSelect und DidDeselect ändern. Wenn in der Methode "selectSelect" NO zurückgegeben wird, werden DidSelect und DidDeselect nicht aufgerufen. Daher bleibt das Erscheinungsbild in Übereinstimmung mit dem ausgewählten Status von collectionView.

1
jx ch

Ich hatte gerade das gleiche Problem. Ich habe verschiedene Lösungen ausprobiert, und die erste, die in meinem Fall funktionierte, bestand darin, die ausgewählten Zellen neu zu laden und dann erneut auszuwählen. Dies funktionierte für mich, egal ob ich die gesamte Sammlungsansicht neu geladen hatte oder nur die Zellen, die mit einem nicht ausgewählten Erscheinungsbild hängen blieben.

Ansätze, die für mich nicht funktionierten:

  • Setzen Sie die selected -Eigenschaft der Zelle auf true, oder ändern Sie sie sogar auf false und wieder auf true.
  • Auswählen des Elements über -selectItemAtIndexPath:animated:scrollPosition: oder sogar Aufheben der Auswahl über -deselectItemAtIndexPath: und erneutes Auswählen.
  • Nur die ausgewählten Zeilen mit -reloadItemsAtIndexPaths: neu laden
  • Alles neu laden mit -reloadData.
1

Ich weiß nicht, warum UICollectionView so unordentlich ist im Vergleich zu UITableViewController... Einige Dinge habe ich herausgefunden.

Der Grund, warum - setSelected: mehrmals aufgerufen wird, ist auf die Aufruf der Sequenzmethoden zurückzuführen. Die Sequenz ist der von UITextFieldDelegate-Methoden sehr ähnlich.

Die Methode - collectionView:shouldSelectItemAtIndexPath: wird aufgerufen, bevor collectionView die Zelle tatsächlich auswählt, da tatsächlich gefragt wird, ob sie ausgewählt werden soll.

- collectionView:didSelectItemAtIndexPath: wird in der Tat aufgerufen, nachdem collectionView die Zelle ausgewählt hat. Daher der Name "hat ausgewählt".

Gleiches gilt für die Abwahl.

TL; DR - Lassen Sie die collectionView-Zelle in der Delegate-Methode - collectionView:shouldSelectItemAtIndexPath: abwählen, indem Sie - selectItemAtIndexPath:animated:scrollPosition: aufrufen. Alles wird gut.

1
funct7

6 Jahre zu spät, aber vielleicht für jemand anderen hilfreich. In solchen Fällen, in denen bestimmte Zellen zunächst nicht auswählbar sein sollen, können Sie einfach isUserInteractionEnabled = false zur awakeFromNib()-Funktion der benutzerdefinierten UICollectionViewCell hinzufügen. Dies kann auch in der xib-Datei erfolgen, dies ist jedoch weniger explizit und für zukünftige Betreuer möglicherweise nicht offensichtlich.

0
Orr Matarasso

Hast du es versucht:

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

Ich fand, dass dies wie gewünscht funktionierte. 

0
user2887309