我试图使用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类中没有委托属性。那么,我如何在那里添加对我的代表的引用?我在这里缺少什么?
答案 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];
这通常会产生奇迹。