2011-11-09 9 views
9

Próbuję dodać niestandardowego delegata do niestandardowej komórki UITableViewCell.Dodawanie delegata do niestandardowego UITableViewCell (błąd nieprawidłowego dostępu)

Na tej komórce mam przycisk, który musi uruchomić metodę w ViewController, gdzie znajduje się UITableView.

Robię wszystkie zwykłe kroki, aby dodać niestandardowego delegata, ale z jakiegoś powodu, gdy otwieram VC w czasie wykonywania aplikacji, zawiesza się i daje mi zły błąd dostępu.

Kiedy komentuję cały kod delegata, działa on prawidłowo, więc domyślam się, że coś jest nie tak, jak dodam mojego delegata. Kiedy zostawiam moją właściwość id nieskomentowaną, wydaje się, że się zawiesza.

Implementuję protokół w VC. Przydzieliłem delegata do komórki w komórceForRowAtIndexPath :. Wszystkie metody delegatów są na miejscu. Używam podobnych konstrukcji w innych klasach, ale nigdy w podklasie UITableViewCells wcześniej.

Zanim opublikuję jakiś kod, chciałbym się dowiedzieć, czy ktoś wcześniej napotkał ten błąd. Jeśli i jak to rozwiązał lub nawet jest możliwe utworzenie niestandardowego delegata dla podklasy UITableViewCell.


EDIT:

My 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 realizuje delegata jako właściwy w ncurses.h

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

a także wykorzystuje jeden delegatemethod z MyTableCellProtocoll w .m

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

przypisać delegata w 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; 
} 

Są to wszystkie lokalizacje używać do delegata. Chcę tylko zmienić buttontitle i wstawić kilka wierszy po tej komórce (zmodyfikowane duplikaty)

Mam nadzieję, że to rozwiąże nieco więcej.


EDIT2: Sposób przycisk nie jest wywoływana na początku jak został metioned w sekcji komentarzy. Edycja kodu z kodem logowania.


EDIT3: Nie ma nic złego w tym przycisku. Jest to właściwość delegata, która jest gdzieś pomieszana. Z przerwami, logami i komentarzami upewniłem się.

Kod jest uruchamiany do ostatniego elementu na mojej liście źródeł danych, a następnie ulega awarii. 1 krok bliżej problemu, jak przypuszczam.


FINAL EDIT: Ok, wydaje się, że wszyscy delegaci i przycisków i innych elementów nie były problemem. To była wysokość FORRowAtIndexPath: przykręcanie mnie. Dzięki za całe wsparcie w każdym razie!

+0

Nie można komentować bez kodu. Ale tak, UITableViewCell może używać UIViewController jako delegata - twój problem brzmi jak standardowe niewłaściwe użycie delegatów. I ... delegacja może nie być najlepszym rozwiązaniem, w zależności. –

+0

Nie ma powodu, dla którego nie byłoby możliwe utworzenie protokołu delegata i identyfikatora ivar w podklasie NSObject (która to UITableViewCell jest) – jbat100

+0

@PaulLynch: Edytowałem pytanie z niektórymi z mojego kodu. Te lokalizacje korzystają z moich działań delegowanych. Mam nadzieję, że to pomoże. –

Odpowiedz

4

To pytanie zostało rozwiązane. Problem nie był w delegacie i nie miał związku z problemami z przyciskami w innych odpowiedziach. Problem polegał na tym, że dostęp do komórki znajdował się na wysokości HighRowAtIndexpath i był łatwy do rozwiązania po wykryciu.

Zostałem uprzejmie wskazany właściwym kierunkiem przez jrturtona i za to on dziękuje.

+3

Czy możesz podzielić się rozwiązaniem? –

1

Na pierwszy interfejsu o nazwie MyTableViewCell, realizacja - iPadCheckTableViewCell. Myślę, że obie powinny mieć to samo imię.

I utworzyć przycisk tak:

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

Ach tak, ma to samo imię w moim kodzie. To tylko literówka. Niestety nie błąd. Zrobiłem edycję dla tego ^^ –

4

Słyszałem, że syntetyzowane Akcesory nie należy stosować w okresie init. Spróbuj zrobić cały kod instalacyjny korzystając bezpośrednio z 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]; 

Jeśli zmienisz tworzenie przycisk do [UIButton buttonWithType:UIButtonTypeCustom]; jak słusznie sugeruje, beryl, to będzie musiała retain to.

+0

To nie jest przycisk, który jest tu zawalony. Kiedy przycisk zostanie całkowicie skomentowany, nadal daje mi ten sam błąd. –

Powiązane problemy