【问题标题】:delegate not being called未调用代表
【发布时间】:2011-08-21 21:00:12
【问题描述】:

我有一个 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。这是为什么?

【问题讨论】:

    标签: iphone objective-c ipad delegates delegation


    【解决方案1】:

    在创建MyCell 之后,您实际上是在设置委托吗?

    简单的检查方法是添加断点并查看委托引用是否为 nil (0x0)。

    编辑:根据您下面的 cmets,很确定您永远不会设置委托。

    当您创建单元格时,您必须将委托对象传递给该单元格,以便它可以调用某些内容。否则,您只是向 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.
    

    【讨论】:

    • 设置委托是什么意思?
    • 1.在您的 - (IBACTION)star:(id)sender 方法中设置断点。但是根据您的第一条评论,我们已经知道问题将是什么(尚未设置,因此为零)。更新答案以提供更多帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 2018-09-16
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多