2012-04-23 13 views
0

のクラスをキャストしないでください、私はClassBのメソッドが呼び出されているiPhoneアプリを持っています。私は、このメソッドが終了したときClassAにコールバックを渡すために、デリゲートのパラメータを渡す:iPhone SDKは、デリゲート

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

しかし、私は警告を知らせるを得る:-Instance method: parseLogin: not found

は、これは驚くべきことではない私は、パラメータをキャストしませんので、特定のクラスとしてデリゲートします。しかし、このメソッドをできるだけ抽象的に保つために、デリゲートのデータ型をidにしておきたいと思います。

これは可能ですか?

私はiOS 5.1(重要な場合)を実行しています。可能であれば、警告を取り除きたいと思います。

多くの感謝! Brett

答えて

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のインスタンスになることがわかっている場合は、 idではなくdelegate型としてClassAを使用します。ちょうどコンパイラの警告を回避するためであっても迅速に

は、次のように呼び出しを除き、であるとして、あなたのコードを残すことである:

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 

だから、あなたのクラスAにあなたはid<LoginDelegate>を使用します。