我有一个我想调用的方法,它将委托的parentDelegate中的Bool返回给我需要信息的对象。如何制作这个调用方法?编译器抱怨对委托的弱引用。
x = [self.delegate.parentDelegate method_I_want_to_call];
Property parentDelegate not found on object of type __weak id <currentClassDelegate>
答案 0 :(得分:3)
最好的解决方案是在self.delegate
上调用协议方法,然后让该类在parentDelegate上调用方法。这样你的代码就会被封装得更多。或者,您可以在parentDelegate
协议中添加currentClassDelegate
属性。
但如果你有充分的理由按照你描述的方式去做,那么这将有效:
// Import whatever class will be used for self.delegate
#import "MarcusDelegate.h"
...
// First we make sure it's safe to cast self.delegate to MarcusDelegate
if ([self.delegate isKindOfClass:[MarcusDelegate class]]) {
id parentDelegate = [(MarcusDelegate *)self.delegate parentDelegate];
if ([parentDelegate respondsToSelector:@selector(method_I_want_to_call)]) {
[parentDelegate method_I_want_to_call];
} else {
NSLog(@"WARNING: self.delegate.parentDelegate can't handle method_I_want_to_call!");
}
} else {
NSLog(@"WARNING: self.delegate is not a MarcusDelegate object!");
}
您可以看到为什么这不是推荐的方法。它破坏了协议编程的一些灵活性。如果在self.delegate
上设置了其他类,则代码不应该中断。
这也有效,但它保留了协议编程的灵活性:
// in the first class
[self.delegate callThatMethodOnParent];
// then in the delegate class
- (void)callThatMethodOnParent
[self.delegate method_I_want_to_call];
}
或者你可以停止假装它是一个协议:
@property (nonatomic, weak) MarcusDelegate *delegate;