2012-04-23 2 views
0

의 클래스를 캐스팅 피 나는 ClassB의 메소드 호출이있는 아이폰 응용 프로그램을 가지고있다. 내가 매개 변수를 캐스팅하지 않기 때문에 -Instance method: parseLogin: not found아이폰 SDK는 대리인

이것은 놀라운 일이 아니다 :

if(delegate && [delegate respondsToSelector:@selector(parseLogin:)]) { 
    [delegate parseLogin:loginInfoDictionary]; 
} 

는 그러나, 나는 내용의 경고를 얻을 :이 방법이 완료되면 나는 ClassA에 콜백을 전달하기 위해 위임 매개 변수 전달 특정 클래스로 위임하십시오. 그러나이 메서드를 가능한 한 추상적으로 유지하려면 대리자의 데이터 형식을 id으로 유지하고 싶습니다.

???

저는 (중요한 경우) iOS 5.1을 실행하고 있습니다. 가능하면 경고를 없애고 싶습니다.

감사합니다. 브렛

답변

4

일반적인 처리 방법은 프로토콜을 만들고 ClassA에 프로토콜을 구현하는 것입니다.

@protocol ProtocolName 
- (void) parseLogin:(NSDictionary*)dictionary; 
@end 

그런 다음

@interface ClassA : NSObject<ProtocolName> 

은 다음과 같이 귀하의 방법을 변경를 ClassA

의 프로토콜을 구현 :

-(void)login:(NSString *)url withDelegate:(id<ProtocolName>)delegate { } 

이 경고 없애 여전히 확장 될 것입니다.

+0

매력처럼 작동합니다! 감사! – Brett

1

다른 클래스를 위임하려면 ClassB.h에서 @protocol을 선언하고 호출 클래스에서 해당 프로토콜 @interface ClassA : UIViewController <ClassBDelegate>을 채택하도록합니다.

형식적으로 더 빠르다 : 대리인이 항상 ClassA의 인스턴스가된다는 것을 알고 있다면? ClassA 대신 ID 대신 대리자 형식.

if(delegate && [delegate respondsToSelector:@selector(parseLogin:)]) { 
    [delegate performSelector:@selector(parseLogin:) withObject:loginInfoDictionary afterDelay:0.0]; 
} 
1

당신이 프로토콜을 사용할 수 없습니다 : 단지 컴파일러 경고를 피하기 위해

라도 빨리이 같은 호출을 제외하고 그대로 코드를 떠나 무엇입니까? 이 같은 프로토콜 :

@protocol LoginDelegate <NSObject> 

@optional 
- (void) parseLogin: (NSDictionary*) dict; 

@end 

따라서, 귀하를 ClassA에 당신은 id<LoginDelegate>을 사용합니다.

관련 문제