iOS: Storyboard CollectionView-Segment wird nicht ausgelöst

8

Ich habe einen UICollectionView-Controller in einem Navigationscontroller eingebettet. Die Auflistungsansicht listet Projekte auf, und jede Zelle soll in einen ProjectDetail-Bildschirm übergehen.

Ich kann den Übergang einfach nicht auslösen. Wenn ich einfach einen Knopf auf der Navigationsleiste drücke und einen Übergang zum Detail anschließe, funktioniert es. Aber das Auslösen aus meiner CollectionView-Zelle funktioniert nicht.

Hier sehen Sie, wie das Storyboard aussieht: Ссылка Ich habe eine Verbindung zwischen der CollectionViewCell und dem ProjectDetailViewController

Hier ist der relevante Code in meinem ProjectDetailViewController:

%Vor%

Ich vermute, das Problem liegt irgendwo darin, wie ich die Zellen mit der CollectionView verbinde.

Jede Hilfe würde sehr geschätzt werden!

    
phil swenson 28.09.2013, 19:20
quelle

4 Antworten

21

Sie können keine Segmente direkt aus Zellen in einem Storyboard erstellen, da die Sammlungsansicht dynamisch über die Datenquelle gefüllt wird. Sie sollten den collectionView:didSelectItemAtIndexPath: und führen Sie das Programm programmatisch mit performSegueWithIdentifier:sender: . Etwas wie das:

%Vor%

Dabei ist MySegueIdentifier die Kennung des im Storyboard definierten Abschnitts.

    
Pulkit Goyal 28.09.2013, 21:33
quelle
3

TLDR: FOR A STORYBOARD, registerClass nicht aufrufen: forCellWithReuseIdentifier :. Es überschreibt, was das Storyboard für die Zelle konfiguriert (einschließlich der Handhabung von Segmenten): So legen Sie ein UILabel in UICollectionViewCell fest

Kurze Einrichtung

  • Benutzte ein Storyboard
  • Erstellen eines neuen Sammlungsansicht-Controllers mithilfe der Xcode-Vorlage Setzen Sie es als Unterklasse von UICollectionViewController.
  • Anfangs wurde die Standard-UICollectionViewCell verwendet und ein UILabel hinzugefügt programmatisch.

Der generierte UICollectionViewController-Code hat die Zelle in viewDidLoad registriert:

%Vor%

Erstausgabe: Das prepareForSegue: sender: -Event hat nicht ausgelöst, was mich zu dieser Antwort gebracht hat. Ich implementierte das UICollectionViewDelegate und das collectionView: didSelectItemAtIndexPath: -Ereignis und nannte es dann programmgesteuert. Das hat meine erste Ausgabe behoben.

Zweites Problem: Ich wechselte zu einer benutzerdefinierten Zelle mit einem Label. Nach dem Anhängen wurde das Zellenetikett nicht angezeigt. Nach einigen Grabungen fand ich eine Lösung in dem Link oben in meiner Antwort.

Drittes Problem und Lösung: Ich habe die "registerClass: forCellWithReuseIdentifier: line" entfernt. Als ich meine App gestartet habe, erschien das Label korrekt, aber als ich auf eine Zelle tippte, rief sie das Ereignis prepareForSegue: sender zweimal an. Durch das Entfernen der registerClass: forCellWithReuseIdentifier-Zeile hat die Zelle Zellenberührungen direkt verarbeitet, ohne dass die Delegate-Methode erforderlich war. So habe ich erwartet, dass das Storyboard funktioniert. Ich löschte die CollectionView: didSelectItemAtIndexPath: -Ereignis, die die doppelte Auslösung von prepareForSegue: sender :. Wenn Sie ein Storyboard verwenden, registrieren Sie die Zellklasse nicht. Es überschreibt, was das Storyboard vorbereitet.

    
Luke 15.01.2015 15:18
quelle
2

Haben Sie die Verbindung Ihrer CollectionView-Zelle in Triggered Segues auf selection hergestellt?

Sie können ein Programm auch mit Hilfe von programmatisch auslösen   [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]

in

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

    
mmackh 28.09.2013 21:29
quelle
0

Gleichwertiger Swift-Code für ähnliche Fragen.

%Vor%

Wenn Ihre Zelle andere überlappende Ansichten hat, ist " Benutzerinteraktion aktiviert " deaktiviert (Sie finden diese Option unter dem Attribut Inspektor Ansicht / Interaktion ). Andernfalls wird Ihre Tap-Geste von der überlappenden Ansicht verbraucht. didSelectItemAtIndexPath wird möglicherweise nicht aufgerufen.

    
brbabu 18.08.2015 17:58
quelle