2011-05-09 2 views
1

У меня есть подкласс UITableViewCell следующим образом:делегат не вызывается

@class MyCell; 

@protocol MyCellDelegate 

- (void) viewController:(MyCell*)viewCon userId:(NSNumber*)uid andType:(NSString*)type; 

@end 

@interface MyCell : UITableViewCell <MHLazyTableImageCell>{ 
    id <MyCellDelegate> delegate; 
    NSNumber * mid; 
    NSNumber * uid; 
} 

- (IBAction) star:(id) sender; 
- (IBAction) reply:(id) sender; 
- (IBAction) message:(id) sender; 

- (void) showMenu; 

@property (nonatomic, retain) id <ConvoreCellDelegate> delegate; 
@property (nonatomic, retain) NSNumber * mid; 
@property (nonatomic, retain) NSNumber * uid; 

делегат вызывается в IBAction:

- (IBAction) star:(id) sender 
{ 
    [self.delegate viewController:self userId:mid andType:@"star"]; 
} 

У меня есть еще один UIVewController следующим образом:

@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UITableViewDelegate, UITableViewDataSource, UISplitViewControllerDelegate, RKObjectLoaderDelegate, MHLazyTableImagesDelegate, UITextViewDelegate, ConvoreCellDelegate> { 
    ....... 
} 

и в реализации я положил:

- (void) viewController:(MyCell*)viewCon userId:(NSNumber*)uid andType:(NSString*)type 
{ 
    NSLog(@"DELEGATE IS CALLED"); 
    if ([type isEqualToString:@"star"]){ 
     NSLog(@"Message id is %@", uid); 
    } else if ([type isEqualToString:@"reply"]){ 
     [message becomeFirstResponder]; 
     message.text = @"@username"; 
    } else if ([type isEqualToString:@"message"]){ 

    } 
} 

Однако это не входит в это. Он никогда не печатает DELEGATE IS CALLED. почему это?

ответ

3

Действительно ли вы устанавливаете делегата после создания MyCell?

Простой способ проверки: добавить точку останова и посмотреть, является ли ссылка делегата нулевой (0x0).

EDIT: Основываясь на ваших комментариях ниже, уверен, что вы никогда не устанавливаете делегата.

Когда вы создаете свою ячейку, вам нужно передать объект-делегат в эту ячейку, чтобы она могла что-то вызвать. В противном случае вы просто отправляете сообщение объекту nil.

Таким образом, предполагая, что вы создаете ваши клетки, как правило, в контроллере табличного:

MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:@"CellID"]; 
    if (cell == nil) { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil]; 
     cell = [topLevelObjects objectAtIndex:0]; 
     cell.delegate = self; // <-------- set the delegate after creation 
    } else { 
     NSLog(@"cached cell"); 
    } 

    //Do you other cell stuff, setting mid and uid for example. 
+0

что вы имеете в виду, установив делегата? – adit

+0

и добавьте точку останова, где – adit

+0

1. Установите точку останова в вашем методе - (IBACTION): (id). Но, основываясь на вашем первом комментарии, мы уже знаем, в чем проблема (он не установлен, поэтому он равен нулю). Обновление ответа, чтобы помочь немного больше. – MarkPowell

Смежные вопросы