2013-09-28 16 views
8

Ho un controller UICollectionView incorporato in un controller di navigazione. La collezioneView elenca i progetti e ogni cella dovrebbe passare a una schermata ProjectDetail.iOS: Storyboard CollectionView seguito non attivato

Semplicemente non riesco a far scattare il seguito. Se faccio semplicemente cadere un pulsante sulla barra di navigazione e collego un seguito al dettaglio, funziona. Ma l'attivazione dalla mia cella CollectionView non lo fa.

Ecco cosa lo storyboard assomiglia: http://cl.ly/RfcM Io ho un segue collegato dal CollectionViewCell alla ProjectDetailViewController

Ecco il codice relativo dentro la mia 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; 
} 

sto cercando di indovinare il il problema è da qualche parte in come sto collegando le celle al CollectionView.

Qualsiasi aiuto sarebbe molto apprezzato!

risposta

21

Non è possibile creare segues direttamente dalle cellule in uno storyboard, perché il CollectionView è popolato in modo dinamico attraverso la fonte dei dati. È necessario utilizzare collectionView:didSelectItemAtIndexPath: ed eseguire i passaggi in modo programmatico utilizzando performSegueWithIdentifier:sender:. Qualcosa di simile a questo:

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

dove MySegueIdentifier è l'identificativo della segue definito nella storyboard.

+0

Quindi qualcuno può dirmi cosa è cambiato? Perché qui http://www.appcoda.com/ios-collection-view-tutorial/ possiamo vedere chiaramente che la connessione è fatta in 'Storyboard' e funziona. – Pahnev

+0

Questa risposta è obsoleta. Sicuramente, puoi creare segues direttamente in Storyboard. –

2

Avete effettuato la connessione della cella CollectionView in Triggered Segues su selection?

Si può anche innescare un segue programatically utilizzando [self performSegueWithIdentifier:@"segueIdentifier" sender:nil]

in

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

3

TLDR: PER UNA STORYBOARD, non chiamare registerClass: forCellWithReuseIdentifier :. Esso sovrascrive quello storyboard imposta per la cella (incluso il modo segues vengono gestiti): How to set a UILabel in UICollectionViewCell

Breve configurazione

  • usato una storyboard
  • Creato un nuovo controller di vista collezione utilizzando il modello Xcode, impostandolo come sottoclasse di UICollectionViewController.
  • Inizialmente utilizzato UICollectionViewCell predefinito, aggiungendo UILabel a livello di programmazione.

Il codice generato UICollectionViewController registrati la cella in viewDidLoad:

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

Prima emissione: Il prepareForSegue: mittente: evento non è stato licenziato, che mi ha portato a questa risposta. Ho implementato UICollectionViewDelegate e collectionView: didSelectItemAtIndexPath: event, quindi chiamato i passaggi a livello di codice. Questo ha risolto il mio primo problema.

Secondo numero: Sono passato a una cella personalizzata contenente un'etichetta. Dopo aver collegato tutto, l'etichetta della cella non veniva visualizzata. Dopo aver scavato, ho trovato una soluzione contenuta nel link in cima alla mia risposta.

Terzo numero e soluzione: Ho rimosso registerClass: forCellWithReuseIdentifier: line. Quando ho eseguito la mia app, l'etichetta è apparsa correttamente, ma quando ho toccato una cella, ha chiamato il preparareForSegue: l'evento mittente due volte. Rimuovendo la riga registerClass: forCellWithReuseIdentifier, la cella stava elaborando direttamente i tocchi cellulari, senza la necessità del metodo delegate. Questo è il modo in cui mi aspettavo che lo storyboard funzionasse. Ho eliminato la collectionView: didSelectItemAtIndexPath: event, che ha risolto il doppio fuoco di prepareForSegue: mittente :. Se si utilizza uno storyboard, non registrare la classe della cella. Sovrascrive ciò che lo storyboard imposta.

+0

@Claude Sai perché usare collectionView: didSelectItemAtIndePath: sovrascrive lo storyboard impostato? – preynolds

0

Codice Swift equivalente per domande simili.

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

Assicurarsi che, nel caso in cui se il tuo cellulare ha altri punti di vista si sovrappongono, "Interazione utente abilitato" è incontrollato (potete trovare questa opzione, sotto attributo ispettore View/Interaction). In caso contrario, il gesto di tocco viene consumato dalla vista sovrapposta, didSelectItemAtIndexPath non può essere chiamato.

Problemi correlati