#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. Но, основываясь на вашем первом комментарии, мы уже знаем, в чем будет проблема (она не установлена, поэтому равна нулю). Обновляю ответ, чтобы помочь немного больше.