2012-08-11 5 views
12

Ho un UITableViewCell personalizzato, chiamato EventCell.UITableViewCell personalizzato non chiama prepareForSegue

EventCell.h

#import <UIKit/UIKit.h> 

@interface EventCell : UITableViewCell 

@property (nonatomic, strong) IBOutlet UILabel *titleLabel; 
@property (nonatomic, strong) IBOutlet UILabel *locationLabel; 
@property (nonatomic, strong) IBOutlet UILabel *dateLabel; 
@property (nonatomic, strong) IBOutlet UILabel *typeLabel; 
@end 

EventCell.m

#import "EventCell.h" 

@implementation EventCell 

@synthesize titleLabel, locationLabel, dateLabel, typeLabel; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 

@end 

Ecco come Sto installando mia cella.

EventsMasterViewController.m

- (EventCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Event *myEvent; 
    NSString *CellIdentifier = @"EventCell"; 
    EventCell *cell = (EventCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"EventCell" owner:nil options:nil]; 

    for (id currentObject in topLevelObjects) 
    { 
     if ([currentObject isKindOfClass:[EventCell class]]) 
     { 
      cell = (EventCell *)currentObject; 
      break; 
     } 
    } 

    myEvent = [self.myEventsDataController objectInListAtIndex:indexPath.row]; 

    cell.titleLabel.text = myEvent.name; 
    cell.locationLabel.text = myEvent.location; 
    cell.typeLabel.text = @"Social"; 
    cell.layer.borderColor = [UIColor blackColor].CGColor; 
    cell.layer.borderWidth = 1.0; 

    return cell; 
} 

La cella è in fase di formattazione grande, sembra esattamente come ho bisogno di. Ma quando clicco su di esso, la cella si illumina in blu e non passa alla vista successiva. Inserisco un breakpoint nel mio metodo prepareForSegue e non viene nemmeno chiamato.

C'è un modo per chiamare manualmente prepareForSegue? Se è così, dove dovrei farlo.

+0

E il tuo 'tableView: didSelectRowAtIndexPath:'? – Desdenova

+0

Non ho un metodo chiamato, dovrei implementarlo? – ardavis

+0

Da quello che sto leggendo, non usiamo 'prepareForSegue' al posto di' didSelectRowAtIndexPath'? – ardavis

risposta

25

è necessario implementare

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 



[self performSegueWithIdentifier:@"YourSegueIdentifier" sender:nil]; 


} 
+1

nota che sia didSelectRowAtIndexPath: e prepareForSegue: sono metodi di UIViewController e non di UITableViewCell – Brabbeldas

1

Come detto sopra, è necessario utilizzare didSelectRowAtIndexPath a meno che non si configura un segue nel vostro storyboard per un nuovo UIViewController. Ciò consente di utilizzare la funzione prepareForSegue anziché la chiamata programmatica di performSegueWithIdentifier.

La speranza che aiuta a chiarire!

+0

Non penso che 'didSelectRowAtIndex' sia una funzione. Controlla la tua risposta e correggi il nome della funzione se non è corretto. – Donovan

+0

Sembra che abbia perso il sentiero alla fine. Grazie! – heckman

1

Il mio problema era l'identificativo della cella.

Così, in - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath ho dichiarato static NSString *cellIdentifier = @"cell"; e poi in storyboard ho aggiunto questo identificatore qui:

enter image description here

E qui si va!

4

Non dovresti avere per implementare didSelectRow affinché funzioni, il controllo del trascinamento da una cella a un'altra vista del controller dovrebbe creare un seguito che funzioni quando si tocca la cella.

Nel mio caso, il problema era che l'editor storyboard creava il seguito in modo errato. Ho avuto due storyboard molto simili, uno funzionasse e l'altro no, e guardando il codice sorgente (tasto destro del mouse sul file storyboard e scegli Apri come ->Source Code), ho visto questo:

<segue destination="UWX-rF-KOc" kind="replace" identifier="showStory" trigger="accessoryAction" splitViewControllerTargetIndex="1" id="Gly-La-KIe"/> 

Nota l'attributo trigger. Questo mi suggerisce che il seguito sarà sparato dall'azione accessoria della cellula.Si può anche vedere questo dal connessioni ispettore della cella:

enter image description here

La rimozione di questo e di sostituire la segue trascinando dalla "selezione" maneggiate sopra al posto di controllo trascinare dalla cella mi ha dato l'segue corretta .

Non sono sicuro di cosa si tratti di questa particolare cella che effettua il controllo del trascinamento connettendosi all'azione accessoria anziché all'azione di selezione, ma ci si va.

+0

grazie per il suggerimento, ho avuto lo stesso problema !! :) – Pangu