2016-07-12 4 views
0

У меня есть метод, который я хочу вызвать, который возвращает Bool в parentDelegate делегата на объект, в котором мне нужна информация. Как мне сделать этот метод вызова? Компилятор жалуется на слабую ссылку на делегата.Как вызвать метод в parentDelegate делегата?

x = [self.delegate.parentDelegate method_I_want_to_call];

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

+0

Что вы имеете в виду Наиболее вероятная проблема здесь в том, что 'x' является слабой переменной, но из этого описания это трудно понять. –

+0

@RobNapier добавлен в вопрос. – Marcus

+1

Это жалуется, что протокол 'currentClassDelegate' не определяет' parentDelegate' как свойство. Это не связано с слабостью. –

ответ

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; 
+1

Я бы определенно пошел со второй версией того, что написал Стерлинг. Объекты с делегатами не должны знать о возможностях делегата, кроме необходимых. Объект не должен знать, что у его делегата есть другой делегат. Он должен знать только, что он может сказать своему делегату. Это односторонний канал связи. – AlexKoren

Смежные вопросы