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!
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. –
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
@PaulLynch: He editado la pregunta con parte de mi código. Estas ubicaciones tienen el uso de mis acciones de delegado. Espero eso ayude. –