objective c - Agregar un delegado a una UITableViewCell personalizada(error de acceso incorrecto)
objective-c delegates (3)
He escuchado que los descriptores de acceso sintetizados no deben usarse durante init
. Intenta hacer todo el código de configuración usando los ivars directamente:
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 la creación de su botón a [UIButton buttonWithType:UIButtonTypeCustom];
como sugiere correctamente el berilio, entonces también necesitarás retain
.
Estoy intentando agregar un delegado personalizado a una UITableViewCell personalizada.
En esta celda, tengo un botón que debe activar un método en ViewController donde está ubicado 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 se bloquea 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 forma 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.
EDITAR:
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
.metro
#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 apropiado en .h
@interface MyVC : UIViewController <UITableViewDelegate, UITableViewDataSource, MyTableCellProtocoll>
y también utiliza el método de un delegado de MyTableCellProtocoll en .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;
}
Estas son todas las ubicaciones que uso 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 del botón no se está llamando al inicio como se mencionó en la sección de comentarios. Código editado con logcode.
EDIT3: no hay nada de 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 ejecuta hasta el último elemento en 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, botones y otros componentes no fueron el problema en absoluto. Era el heightForRowAtIndexPath: atornillarme. Gracias por todo su apoyo de todos modos!
Al principio su interfaz se llama MyTableViewCell , implementación - iPadCheckTableViewCell . Creo que ambos deberían tener el mismo nombre.
Y crea un botón como este:
self.myButton = [UIButton buttonWithType:UIButtonTypeCustom]; // instead of self.myButton = [[UIButton alloc] init]; - it''s a memory leak
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.