iOS: Storyboard CollectionView segue nicht ausgelöst wird
Ich habe eine UICollectionView controller eingebettet ist, einen navigation-controller. Der collectionView listet die Projekte auf, und jede Zelle soll segue zu einem ProjectDetail Bildschirm.
Habe ich einfach nicht bekommen kann den Wechsel auslösen. Wenn ich einfach eine Taste auf der nav-bar-und-hook-up ein übergang ins detail, es funktioniert. Aber die Auslösung von meinem CollectionView Zelle nicht.
Hier ist, was das storyboard sieht so aus: http://cl.ly/RfcM ich habe ein segue hakte sich aus der CollectionViewCell der ProjectDetailViewController
Hier ist der relevante code in meiner ProjectDetailViewController:
@interface ProjectCollectionViewController () {
NSArray *feedPhotos;
Projects *projects;
}
@end
@implementation ProjectCollectionViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.collectionView registerClass:[FeedViewCell class] forCellWithReuseIdentifier:@"cell"];
[self loadData];
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"selected %d", indexPath.row);
Project *project = [projects getProject:indexPath.row];
NSLog(@"project = %@", project);
}
- (void)loadData {
[self.projectLoader loadFeed:self.username
onSuccess:^(Projects *loadedProjects) {
NSLog(@"view did load on success : projects %@", loadedProjects);
projects = loadedProjects;
[self.collectionView reloadData];
}
onFailure:^(NSError *error) {
[self handleConnectionError:error];
}];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return projects.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"cell";
FeedViewCell *cell = (FeedViewCell *) [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:1.0 alpha:1.0];
UIImageView *cellImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
Project *project = [projects getProject:indexPath.row];
NSString *imageUrl = [project coverPhotoUrl:200 forHeight:200];
NSLog(@"imageurl =>%@", imageUrl);
if (imageUrl) {
[cellImageView setImageWithURL:[NSURL URLWithString:imageUrl]];
}
[cell addSubview:cellImageView];
cell.imageView = cellImageView;
return cell;
}
Ich vermute das problem liegt irgendwo im, wie ich Sie anschließen die Zellen an die CollectionView.
Jede Hilfe wäre sehr geschätzt werden!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann nicht erstellt werden, leitet über, die direkt von Zellen in einem storyboard, da die collectionview aufgefüllt wird dynamisch durch die Daten-Quelle. Sollten Sie die
collectionView:didSelectItemAtIndexPath:
und führen Sie die segue ein Programm mithilfe derperformSegueWithIdentifier:Absender:
. So etwas wie dieses:wo
MySegueIdentifier
ist die Kennung der segue definiert im storyboard.Storyboard
und es funktioniert.TLDR: FÜR EIN STORYBOARD, rufen Sie nicht registerClass:forCellWithReuseIdentifier:. Es überschreibt, was das storyboard stellt für die Zelle (einschließlich, wie leitet über behandelt werden):
Wie man ein UILabel in UICollectionViewCell
Kurze setup -
Einstellung es als Unterklasse von UICollectionViewController.
programmgesteuert.
Den generierten UICollectionViewController code registriert die Zelle, in viewDidLoad:
Ersten Ausgabe:
Die prepareForSegue:sender: event wurde nicht gefeuert, was brachte mich zu dieser Antwort .
Ich habe implementiert die UICollectionViewDelegate und collectionView:didSelectItemAtIndexPath: Ereignis dann als den übergang programmgesteuert.
Diese Feste meine erste Frage.
Zweite Frage: ich eingeschaltet, um eine benutzerdefinierte Zelle mit einem label. Nach Einhängen alles, die Zelle label nicht angezeigt.
Nach einigem Graben fand ich eine Lösung, enthalten in den link oben in meiner Antwort.
Dritte Problem und Lösung: ich entfernte die registerClass:forCellWithReuseIdentifier: line. Wenn ich lief meine app, die label erschien richtig, aber wenn ich getippt, eine Zelle, ist es als die prepareForSegue:sender-Ereignis zweimal. Durch das entfernen der registerClass:forCellWithReuseIdentifier Linie, wurde die Zelle Verarbeitung Zelle berührt direkt, ohne die Notwendigkeit für die delegate-Methode. Dies ist, wie ich erwartet das storyboard zu arbeiten. Ich löschte die collectionView:didSelectItemAtIndexPath: Ereignis, welches gelöst werden, die Doppel-Entlassung von prepareForSegue:sender:. Wenn Sie ein storyboard, registrieren Sie sich nicht für die cell-Klasse. Es überschreibt, was storyboard legt.
Haben Sie Ihre CollectionView Zelle in Verbindung
Triggered Segues
aufselection
?Können Sie auch auslösen, segue ein Programm mithilfe
[self performSegueWithIdentifier:@"segueIdentifier" sender:nil]
in
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
Entspricht dem Swift-code für eine ähnliche Frage.
Stellen Sie sicher, im Falle dass, wenn Ihr Handy hat anderen sich überlagernden Ansichten, "Benutzerinteraktion Aktiviert" ist deaktiviert (diese option finden Sie unter Attribut-inspector-View/- Interaktion). Andernfalls werden Sie Ihre Tap-Geste ist verbraucht durch die überlappende Ansicht, didSelectItemAtIndexPath kann nicht aufgerufen werden.