2012-08-11 26 views
12

Tengo una UITableViewCell personalizada, llamada EventCell.Personalizado UITableViewCell no llamando a 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 

Así es como yo estoy creación de mi celular.

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 celda se formatea grande, se ve exactamente como lo necesito para. Pero cuando hago clic en él, la celda se ilumina en azul y no pasa a la vista siguiente. Puse un punto de interrupción en mi método prepareForSegue y ni siquiera se llama.

¿Hay alguna manera de llamar a prepareForSegue manualmente? Si es así, ¿dónde debería hacer eso?

+0

¿Qué hay de 'tableView: didSelectRowAtIndexPath:'? – Desdenova

+0

No tengo un método llamado así, ¿tendría que implementar eso? – ardavis

+0

Por lo que estoy leyendo, ¿no usamos 'prepareForSegue' en lugar de' didSelectRowAtIndexPath'? – ardavis

Respuesta

25

es necesario implementar

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



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


} 
+1

tenga en cuenta que didSelectRowAtIndexPath: y prepareForSegue: son métodos de UIViewController y no de UITableViewCell – Brabbeldas

1

Como se mencionó anteriormente, es necesario utilizar didSelectRowAtIndexPath menos que se configure un segue en su guión para una nueva UIViewController. Esto le permite usar la función prepareForSegue en lugar de la llamada programática de performSegueWithIdentifier.

Espero que ayude a aclararlo!

+0

No creo que 'didSelectRowAtIndex' sea una función. Verifique su respuesta y corrija el nombre de la función si es incorrecta. – Donovan

+0

Parece que me perdí el camino al final. ¡Gracias! – heckman

1

Mi problema era el identificador de la celda.

Así, en - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath declaré static NSString *cellIdentifier = @"cell"; y luego en el guión gráfico añadí este identificador aquí:

enter image description here

y ya está!

4

Usted no debería tener para implementar didSelectRow para que esto funcione - Control-arrastrar desde una célula a otra vista controlador debe crear un segue que funciona al tocar la célula.

En mi caso, el problema era que el editor del guión gráfico creaba el segue incorrectamente. Tenía dos guiones gráficos muy similares, uno trabajaba y el otro no, y mirando el código fuente (clic derecho en el archivo de guión gráfico y seleccione Abrir como ->Código Fuente), vi esto:

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

Tenga en cuenta el atributo trigger. Esto me sugiere que la transición se producirá a partir de la acción accesoria de la célula.Incluso se puede ver esto desde la conexiones inspector de la célula:

enter image description here

La eliminación de este y sustitución de la segue arrastrando desde la "selección" manejar anterior en lugar del control arrastrando desde el celular me dio la segue correcta .

No estoy seguro de qué se trata de esta celda en particular que hace que el control de arrastre se conecte a la acción de accesorio en lugar de la acción de selección, pero ahí lo tienes.

+0

gracias por la sugerencia, tuve el mismo problema !! :) – Pangu

Cuestiones relacionadas