iphone:在课堂上实现委托

时间:2010-05-17 22:23:02

标签: iphone delegates uitableview

我试图使用presentModalViewController调用一个模态表视图控制器,但我不知道如何处理该委托。以下代码给出了一个错误:

MyRidesListView *controller = [[MyRidesListView alloc] init];
    controller.delegate = self;
    [self presentModalViewController:controller animated:YES];
    [controller release];

错误:

Request for member 'delegate' is something not a structure or union

现在,我意识到我的MyRidesListView类中没有委托属性。那么,我如何在那里添加对我的代表的引用?我在这里缺少什么?

3 个答案:

答案 0 :(得分:4)

一般来说,委托是这样定义的属性:

id<NameOfDelegateProtocol> delegate;

@property (nonatomic, assign) id<NameOfDelegateProtocol> delegate;

编辑:你说你的父类是UITableViewController。您可能想要这样做:

controller.tableView.delegate = self;

答案 1 :(得分:1)

为什么你认为你需要代表?为什么不删除“controller.delegate = self”行。否则,您需要按照我在下面概述的方式实现委托系统,或者使MyRidesListView成为实现委托的viewcontroller的子类。

看起来您剪切并粘贴了一些使用委托的示例代码,然后替换了您自己的不提供委托的viewcontroller。如果您不知道委托的用途,那么只需删除该行。

我将从我的一个测试程序中剪切并粘贴一些实际代码,以向您展示它是如何完成的:

接口文件中的

将一个委托实例变量添加到您的类并使其成为属性,以便您可以使用“blah.delegate = foo”语法来设置它。

@interface BAPClient : NSObject {
    CGSize imageSize;
    id <BAPClientDelegate> delegate;
}

@property (nonatomic, readonly) CGSize imageSize;
@property (nonatomic, assign) id <BAPClientDelegate> delegate;
@end

// define the protocol spoken.  (what the delegate must implement)

@protocol BAPClientDelegate
- (void)addTile:(BAPTile *)tile;
@end

在实现中,您必须在适当的时间调用该委托:

- (void)deliverTile:(BAPTile *) tile {
    NSLog(@"%s tile=%p",__FUNCTION__,tile);
    if ([self delegate])
        [[self delegate] addTile:tile];

    [tile release];
}

答案 2 :(得分:0)

尝试通过setter设置委托对象

[controller setDelegate:self];

这通常会产生奇迹。