Наилучшим решением является вызов метода протокола на 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;
Что вы имеете в виду Наиболее вероятная проблема здесь в том, что 'x' является слабой переменной, но из этого описания это трудно понять. –
@RobNapier добавлен в вопрос. – Marcus
Это жалуется, что протокол 'currentClassDelegate' не определяет' parentDelegate' как свойство. Это не связано с слабостью. –