делегат не вызывается

#iphone #objective-c #ipad #delegates #delegation

#iPhone #objective-c #iPad #делегаты #делегирование

Вопрос:

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

Вы на самом деле устанавливаете делегат после создания 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.
  

Комментарии:

1. что вы подразумеваете под установкой делегата?

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