2013-09-28 5 views
8

Ich habe einen UICollectionView-Controller in einem Navigationscontroller eingebettet. Die CollectionView listet Projekte auf und jede Zelle soll in einen ProjectDetail-Bildschirm übergehen.iOS: Storyboard CollectionView-Segment wird nicht ausgelöst

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

ist, was das Drehbuch wie folgt aussieht: http://cl.ly/RfcM Ich habe eine segue vom CollectionViewCell zum ProjectDetailViewController angeschlossen

Hier ist der entsprechende Code in meinem 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, die Problem ist irgendwo in wie ich die Zellen an die CollectionView anschließen.

Jede Hilfe würde sehr geschätzt werden!

Antwort

21

Sie nicht segues direkt aus Zellen in einem Storyboard, weil die Kollektion dynamisch durch erstellen bevölkert die Datenquelle. Sie sollten collectionView:didSelectItemAtIndexPath: verwenden und das Programm programmatisch mit performSegueWithIdentifier:sender: ausführen. Etwas wie folgt aus:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    [self performSegueWithIdentifier:@"MySegueIdentifier" sender:self]; 
} 

wo MySegueIdentifier ist die Kennung der Segue in Storyboard definiert.

+0

Kann mir jemand sagen, was sich geändert hat? Denn hier http://www.appcoda.com/ios-collection-view-tutorial/ können wir deutlich sehen, dass die Verbindung in 'Storyboard' hergestellt wird und es funktioniert. – Pahnev

+0

Diese Antwort ist veraltet. Auf jeden Fall können Sie direkt im Storyboard Segmente erstellen. –

2

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

können Sie lösen auch eine segue programmatisch mit [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]

in

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

3

TLDR: Rufen Sie für eine STORYBOARD nicht registerClass: forCellWithRuseIdentifier :. Er überschreibt, was das Storyboard für die Zelle einrichtet (einschließlich, wie segues behandelt werden): How to set a UILabel in UICollectionViewCell

Kurz Setup

  • Verwendet ein Storyboard
  • eine neue Kollektion View-Controller mit der Xcode-Vorlage erstellt, Setzen Sie es als Unterklasse von UICollectionViewController.
  • Anfänglich verwendet die Standard UICollectionViewCell, ein UILabel programmgesteuert hinzufügen.

Der generierte Code UICollectionViewController die Zelle in viewDidLoad registriert:

[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; 

Erste Ausgabe: Der prepareForSegue: Absender: Ereignis nicht feuert, was mich zu dieser Antwort gebracht. Ich implementiert die UICollectionViewDelegate und collectionView: didSelectItemAtIndexPath: -Ereignis, dann heißt das Programm programmgesteuert. Das hat meine erste Ausgabe behoben.

Zweite Ausgabe: Ich wechselte zu einer benutzerdefinierten Zelle mit einem Etikett. Nach dem Anhängen wurde das Zellenetikett nicht angezeigt. Nach einigem Graben fand ich eine Lösung, die in dem Link oben in meiner Antwort enthalten war.

Dritte Ausgabe und Lösung: Ich entfernte die registerClass: forCellWithRuseIdentifier: Zeile. Als ich meine App gestartet habe, erschien das Etikett 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 vorgibt.

+0

@Claude Weißt du, warum collectionView verwendet: didSelectItemAtIndePath: überschreibt, was das Storyboard vorgibt? – preynolds

0

Gleichwertiger Swift-Code für ähnliche Frage.

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    self.performSegueWithIdentifier(@"TargetSegway", sender: self) 
} 

Vergewissern Sie sich, im Falle, wenn Ihre Zelle andere überlappende Ansichten hat „Benutzer-Interaktion Enabled“ ist ungeprüft (Sie können diese Option finden, unter dem Attribut Inspektor Ansicht/Interaktion). Andernfalls wird Ihre Tap-Geste von der überlappenden Ansicht verbraucht. didSelectItemAtIndexPath kann nicht aufgerufen werden.