0

ClassBメソッドが呼び出された iPhone アプリがあります。

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

このメソッドは から呼び出されClassAます。ClassAこのメソッドが終了したときにコールバックを渡すために、delegate パラメーターを渡します。

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

ただし、次のような警告が表示されます。-Instance method: parseLogin: not found

パラメーター デリゲートを特定のクラスとしてキャストしたことがないため、これは驚くべきことではありません。ただし、このメソッドを可能な限り抽象化するために、デリゲートのデータ型を として保持したいと思いidます。

これは可能ですか????

iOS 5.1 を実行しています (問題がある場合)。できれば警告を消したいです。

どうもありがとう!ブレット

4

3 に答える 3

4

これを処理する一般的な方法は、プロトコルを作成し、ClassA にプロトコルを実装させることです。

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

次に、ClassA でプロトコルを実装します。

@interface ClassA : NSObject<ProtocolName>

次に、メソッドを次のように変更します。

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

これにより、警告がなくなり、拡張可能になります。

于 2012-04-23T20:29:38.677 に答える
1

異なるクラスがデリゲートになりたい場合は、ClassB.h で @protocol を宣言し、呼び出し元のクラスにそのプロトコルを採用させます@interface ClassA : UIViewController <ClassBDelegate>

少し形式ばらず、より迅速に: デリゲートが常に ClassA のインスタンスになることがわかっている場合は? id の代わりにデリゲート タイプとして ClassA を使用します。

さらに迅速に、コンパイラの警告を回避するには、次のように呼び出すことを除いて、コードをそのままにしておくことです。

if(delegate && [delegate respondsToSelector:@selector(parseLogin:)]) {
   [delegate performSelector:@selector(parseLogin:) withObject:loginInfoDictionary afterDelay:0.0];
}
于 2012-04-23T20:31:55.073 に答える
1

プロトコルを使用できませんか?このようなプロトコル:

@protocol LoginDelegate <NSObject>

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

@end

したがって、classA では を使用しますid<LoginDelegate>

于 2012-04-23T20:32:13.350 に答える