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!
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:
Dabei ist MySegueIdentifier
die Kennung des im Storyboard definierten Abschnitts.
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
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.
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
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.
Tags und Links ios uicollectionview uistoryboard