делегат не вызывается - PullRequest
1 голос
/ 09 мая 2011

У меня есть подкласс 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"]){

    }
}

Однако это не входит в это. Это никогда не печатает, ДЕЛЕГАТ ВЫЗОВ. почему это?

1 Ответ

3 голосов
/ 09 мая 2011

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

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

РЕДАКТИРОВАТЬ: Основываясь на ваших комментариях ниже, почти уверен, что вы никогда не устанавливаете делегата.

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

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

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.
...