2011-11-09 10 views
9

Sto tentando di aggiungere un delegato personalizzato a un UITableViewCell personalizzato.Aggiunta di un delegato a un UITableViewCell personalizzato (errore di accesso errato)

Su questa cella ho un pulsante che deve attivare un metodo nel ViewController su cui si trova UITableView.

Sto facendo tutti i soliti passaggi per aggiungere un delegato personalizzato ma per qualche motivo quando apro il VC in runtime l'app si arresta in modo anomalo e mi dà un errore di accesso errato.

Quando commento tutto il codice delegato funziona correttamente quindi la mia ipotesi è che qualcosa non funzioni nel modo in cui aggiungo il mio delegato. Quando lascio la proprietà id non commentata sembra bloccarsi.

Implementare il protocollo nel VC. Ho assegnato il delegato alla cella in cellForRowAtIndexPath :. Tutti i metodi delegati sono a posto. Ho usato costruzioni simili in altre classi, ma mai in una sottoclasse di UITableViewCells prima.

Prima di pubblicare un codice, vorrei sapere se qualcuno ha riscontrato questo errore prima. Se e come lo ha risolto o se è anche possibile creare un delegato personalizzato per una sottoclasse UITableViewCell.


EDIT:

mio 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 il delegato come appropriato nel .h

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

e utilizza anche quella delegatemethod dal MyTableCellProtocoll nel .m

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

assegno il delegato nella 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; 
} 

Queste sono tutte le posizioni che uso per il delegato. Quello che voglio è cambiare il buttontitle e inserire alcune righe dopo quella cella (duplicati modificati)

Spero che questo chiarisca un po 'di più le cose.


EDIT2: Il metodo pulsante non è stato chiamato alla partenza come è stato metioned nella sezione commenti. Codice editato con codice di accesso.


Edit3: Non c'è niente di sbagliato con il pulsante. È la proprietà delegata che è incasinata da qualche parte. Con i punti di interruzione e i registri e commentando mi sono assicurato di quello.

Il codice viene eseguito fino all'ultimo elemento nell'elenco di origini dati, quindi si arresta in modo anomalo. 1 passo più vicino al problema ora suppongo.


montaggio finale: Ok, sembra che tutti i delegati e dei pulsanti e altri componenti non erano affatto il problema. Era heightForRowAtIndexPath: avermi fregato. Grazie per tutto il vostro supporto comunque!

+0

Impossibile commentare senza il codice. Ma sì, un UITableViewCell può usare un UIViewController come delegato - il tuo problema suona come l'uso scorretto standard dei delegati. E ... la delega potrebbe non essere la soluzione migliore, a seconda. –

+0

Non c'è motivo per cui dovrebbe essere impossibile creare un protocollo delegato e id ivar in una sottoclasse NSObject (che è UITableViewCell) – jbat100

+0

@PaulLynch: ho modificato la domanda con un po 'del mio codice. Queste posizioni hanno l'utilizzo delle mie azioni delegate. Spero che sia d'aiuto. –

risposta

4

Questa domanda è stata risolta. Il problema non era nel delegato e non correlato ai problemi del pulsante nelle altre risposte. Il problema era nell'accesso di una cella in heightForRowAtIndexpath: ed è stato risolto facilmente una volta scoperto.

Sono stato gentilmente indicato dalla direzione giusta da jrturton e per questo ha i miei ringraziamenti.

+3

Puoi condividere la soluzione? –

1

In un primo momento l'interfaccia denominata MyTableViewCell, implementazione - iPadCheckTableViewCell. Penso che entrambi dovrebbero avere lo stesso nome.

E creare pulsante mi piace questo:

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

Ah sì, ha lo stesso nome nel mio codice. È solo un refuso. Sfortunatamente non l'errore. Ho fatto una modifica per quello ^^ –

4

ho sentito dire che di accesso sintetizzati non deve essere usato durante init. Provate a fare tutto il codice di impostazione utilizzando direttamente i 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]; 

Se si cambia la creazione pulsante per [UIButton buttonWithType:UIButtonTypeCustom]; come berillio giustamente suggerisce, allora si avrà bisogno anche di retain esso.

+0

Non è il pulsante che è incasinato qui tho. Quando il pulsante è completamente commentato, mi dà ancora lo stesso errore di bad_access. –

Problemi correlati