2016-07-12 3 views
0

정보를 필요로하는 객체에 delegate의 parentDelegate에 Bool을 반환하는 메소드가 있습니다. 어떻게이 호출 메소드를 만들 수 있습니까? 컴파일러는 델리게이트에 대한 약한 참조에 대해 불평합니다.delegate의 parentDelegate에서 메서드를 호출하려면 어떻게해야합니까?

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

+0

당신이 무엇을 의미합니까 여기에서 가장 큰 문제는 'x'가 약한 변수이지만이 설명에서 알기가 어렵다는 것입니다. –

+0

@RobNapier가 질문에 추가되었습니다. – Marcus

+1

이것은'currentClassDelegate' 프로토콜이'parentDelegate'를 속성으로 정의하지 않는다고 불평하고 있습니다. 약점과 관련이 없습니다. –

답변

3

x = [self.delegate.parentDelegate method_I_want_to_call]; 가장 좋은 방법은 self.delegate에 프로토콜 메소드를 호출하고 그 클래스 호출에게 parentDelegate의 방법을 가지고있다. 그렇게하면 코드가 더 캡슐화됩니다. 또는 currentClassDelegate 프로토콜에 parentDelegate 속성을 추가 할 수 있습니다.

그러나 당신이 당신이 설명하는 방법을 할 수있는 좋은 이유가있는 경우, 다음이 작동합니다

// 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

관련 문제