- (void)activate:(NSDictionary *)options {
Class c = [self displayClass];
self.display = [[c alloc] initWithOptions:options];
(c *)self.display.delegate = self;
我的显示属性是基本的显示类。
最后一行出错。有问题的委托只适用于当前的displayClass,它是Display的子类。
如何投射以设置委托?
编辑:
我明白(显示*)有效。我试图使((显示*)部分动态。当我做(c *)self.display).delegate = self;我得到了#34;预期的表达"。
答案 0 :(得分:1)
听起来你在这里假设了几种自定义方法(initWithOptions
和delegate
)。如果不先检查这些方法是否存在,则调用它们可能不安全。我建议在启动显示对象之前创建一个协议并检查你的类是否符合它。
@protocol MYDisplay //use whatever prefix you want here
@property (readwrite, weak) id<MYDisplayDelegate> delegate;
- (id) initWithOptions:(NSDictionary*)options;
@end
然后,在您的activate方法中,检查这是否是要使用的有效类并转换为该协议的实例。
- (void)activate:(NSDictionary *)options
{
Class c = [self displayClass];
if ([c conformsToProtocol:@protocol(MYDisplay)])
{
id<MYDisplay> display = [[c alloc] initWithOptions:options];
display.delegate = self;
self.display = display;
}
else
{
NSLog("Can't create a display from class %@", NSStringFromClass(c));
}
}
然后,每个Display类都需要采用此协议。
@class SomeConcreteDisplayClass : NSObject <MYDisplay>
@property (readwrite, weak) delegate;
- (id) initWithOptions:(NSDictionary*)options;
...
@end
如果您要混合并匹配自己的自定义类和框架类以用作Display对象,也可以extend UIKit classes使它们符合此协议
你可以查看很多关于NSObject和类的类似内容。请查看NSObject class reference中的“获取方法信息”。
答案 1 :(得分:0)
我假设您的超类名称是Display
。请尝试以下代码。
- (void)activate:(NSDictionary *)options {
Class c = [self displayClass];
self.display = [[c alloc] initWithOptions:options];
((Display *)self.display).delegate = self;
}