如何调用委托的parentDelegate中的方法?

时间:2016-07-12 17:25:30

标签: ios objective-c delegates

我有一个我想调用的方法,它将委托的parentDelegate中的Bool返回给我需要信息的对象。如何制作这个调用方法?编译器抱怨对委托的弱引用。

x = [self.delegate.parentDelegate method_I_want_to_call];

Property parentDelegate not found on object of type __weak id <currentClassDelegate>

1 个答案:

答案 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;