2011-11-09 15 views
9

Estoy intentando agregar un delegado personalizado a una UITableViewCell personalizada.Agregar un delegado a una UITableViewCell personalizada (error de acceso erróneo)

En esta celda tengo un botón que debe activar un método en el ViewController donde se encuentra el UITableView.

Estoy haciendo todos los pasos habituales para agregar un delegado personalizado, pero por alguna razón cuando abro el VC en tiempo de ejecución, la aplicación falla y me da un error de acceso incorrecto.

Cuando comento todo el código de delegado funciona correctamente, así que supongo que algo está mal de la manera en que agrego mi delegado. Cuando dejo mi propiedad de id sin comentarios, parece que se bloquea.

Implemento el protocolo en el VC. Asigné el delegado a la celda en el cellForRowAtIndexPath :. Todos los métodos delegados están en su lugar. He estado utilizando construcciones similares en otras clases, pero nunca en una subclase de UITableViewCells.

Antes de publicar algún código, me gustaría saber si alguien ha encontrado este error antes. Si y cómo lo resolvió o si es posible crear un delegado personalizado para una subclase de UITableViewCell.


EDIT:

Mi customCell.h

#import <UIKit/UIKit.h> 

@class MyTableViewCell; 

@protocol MyTableCellProtocoll <NSObject> 

-(void) didPressButton:(MyTableViewCell *)theCell; 

@end 

@interface MyTableViewCell : UITableViewCell 
{ 

    UIButton *myButton; 

    id<MyTableCellProtocoll> delegationListener; 

} 

@property (nonatomic,retain) UIButton *myButton; 

@property (nonatomic,assign) id<MyTableCellProtocoll> delegationListener; 

- (void) buttonAction; 

@end 

.m

#import "MyTableViewCell.h" 

@implementation MyTableViewCell 

@synthesize myButton; 
@synthesize delegationListener; 

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

     self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
     self.myButton.backgroundColor = [UIColor clearColor]; 
     self.myButton.frame = CGRectMake(5, 0, 10, 32); 
     self.myButton.titleLabel.adjustsFontSizeToFitWidth = YES; 
     [self.myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]; 
     [self.contentView addSubview:self.myButton]; 
    } 
    return self; 
} 

- (void) buttonAction 
{ 
    NSLog(@"buttonpressed"); 
    [self.delegationListener didPressButton:self]; 
} 

@end 

MyVC implementa el delegado como adecuada en el .h

@interface MyVC : UIViewController <UITableViewDelegate, UITableViewDataSource, MyTableCellProtocoll> 

y que también utiliza el delegatemethod de MyTableCellProtocoll en el .m

- (void)didPressButton:(MyTableViewCell *)theCell 
{ 
    NSLog(@"didPressButton"); 
} 

asigno el delegado en el cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.delegationListener = self; 
    } 

    return cell; 
} 

Estos son todos los lugares que utilizo para el delegado. Lo que quiero que haga es cambiar el título e insertar algunas filas después de esa celda (duplicados modificados)

Espero que esto aclare un poco más las cosas.


Edit2: El método de botón no está siendo llamado en el arranque como se metioned en la sección de comentarios. Código editado con logcode.


Edit3: No hay nada malo con el botón. Es la propiedad del delegado lo que está mal en algún lado. Con puntos de interrupción y registros y comentarios me aseguré de eso.

El código se está ejecutando hasta el último elemento de mi lista de fuentes de datos y luego se bloquea. 1 paso más cerca del problema, ahora supongo.


edición final: Ok, parece que todos los delegados y los botones y otros componentes no fuera el problema en absoluto. Era el heightForRowAtIndexPath: atornillarme. ¡De todos modos, gracias por todo su apoyo!

+0

No se puede hacer comentarios sin el código. Pero sí, una UITableViewCell puede usar un UIViewController como delegado: su problema parece ser el uso incorrecto estándar de los delegados. Y ... la delegación podría no ser la mejor solución, dependiendo. –

+0

No hay ninguna razón por la cual debería ser imposible crear un protocolo delegado y una identificación ivar en una subclase NSObject (que es UITableViewCell) – jbat100

+0

@PaulLynch: He editado la pregunta con parte de mi código. Estas ubicaciones tienen el uso de mis acciones de delegado. Espero eso ayude. –

Respuesta

4

Esta pregunta ha sido resuelta. El problema no estaba en el delegado y no estaba relacionado con los problemas de los botones en las otras respuestas. El problema radicaba en el acceso de una celda en heightForRowAtIndexpath: y se resolvió fácilmente una vez resuelto.

Fui señalado gentilmente por Jrturton en la dirección correcta y por esto tiene mi agradecimiento.

+3

¿Puede compartir la solución? –

1

Al principio de su interfaz llamada MyTableViewCell, aplicación - iPadCheckTableViewCell. Creo que ambos deberían tener el mismo nombre.

Y crear botón de la siguiente manera:

self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; // instead of self.myButton = [[UIButton alloc] init]; - it's a memory leak 
+0

Ah sí, tiene el mismo nombre en mi código. Es solo un error tipográfico. Lamentablemente no es el error. Hice una edición para eso ^^ –

4

yo he oído que descriptores de acceso sintetizados no debe utilizarse durante init. Tratar de hacer todo el código de configuración directamente mediante las Ivars:

myButton = [[UIButton alloc] init];   
myButton.backgroundColor = [UIColor clearColor];   
myButton.frame = CGRectMake(5, 0, 10, 32);   myButton.titleLabel.adjustsFontSizeToFitWidth = YES;   
[myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];   
[contentView addSubview:myButton]; 

Si cambia de creación de botones para [UIButton buttonWithType:UIButtonTypeCustom]; como el berilio sugiere con razón, entonces usted también tendrá que retain ella.

+0

No es el botón que está mal aquí aunque. Cuando el botón está completamente comentado, todavía me da el mismo error de bad_access. –

Cuestiones relacionadas