0

リンクで別のプロジェクトで使用できるジェネリッククラスを作成します。
ある時点で、オブジェクトを所有し、クラスに割り当てられて保持されているリスナーのメソッドを呼び出します。
しかし、その呼び出し元が消滅することがあるので、その場合、返信メッセージをアプリケーションデリゲートにルーティングする必要があります。ここでiPhone - ジェネリッククラス内のアプリケーションデリゲートの参照

は(呼び出し側が作成したもので、私のクラスのインスタンスを所有している)私は、発信者のために行う方法です:

私はresponseListenerの代わりにアプリのデリゲートクラスを参照することがどのように
if ([self.responseListener respondsToSelector:@selector(serverAnswered:error:)]) { 
     // some job to construct the return object 

     [self.responseListener performSelector:@selector(serverAnswered:error:) withObject:response withObject:nil]; 
    } 

呼び出し元はdisapearedですか?

答えて

3

「発信者がいなくなったときに」「発信者」とは何を意味するのかよく分かりません。ただし、どこからでもアプリケーションデリゲートにアクセスする方法は次のとおりです。

[UIApplication sharedApplication].delegate; 

あなたが特定のアプリケーションのデリゲートに固有のそれのメソッドを呼び出す必要がある場合、あなたはそれとキャストをインポートする必要があります。

#import "MyAppDelegate.h" 

// ... 

MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate; 

更新:

プロトコルを使用して、任意のアプリデリゲートに独自のライブラリのメソッドを呼び出すこと。

// The app delegate in your library users app 
#import "YourFancyLibrary.h" 

@interface MyAppDelegate : NSObject <UIApplicationDelegate, YourFancyLibraryDelegate> 

// In YourFancyLibrary.h, declare that protocol 
@protocol YourFancyLibraryDelegate 
- (void)myFancyMethod; 
@end 

// Refer to it in the guts of your library. 
id<YourFancyLibraryDelegate> delegate = [UIApplication sharedApplication].delegate; 
if (![delegate conformsToProtocol:@protocol(YourFancyLibraryDelegate)]) return; 
if (![delegate respondsToSelector:@selector(myFancyMethod)]) return; 
[delegate myFancyMethod]; 

これは、あなたの図書館利用者が実装するために必要なもののメソッド指定として、あなたのAPIを明確にし、それは動的なメッセージが送信の実行時間を頼っコンパイル時のチェックが可能になりますの代わりとして、良い解決策であるだろう。

また、プロトコルをスキップして、そのプロトコルを直接呼び出すこともできます。

+0

はい、私はアプリケーションデリゲートでカスタムメソッドを呼び出したいと思います。私のクラスはジェネリックであり、異なるプロジェクトに含めることができるので、そのクラスはそれが含まれているプロジェクトに使用されているアプリケーションデリゲートクラスの名前を知らない。クラスをknwoingせずに2番目の呼び出しを書く方法はあるアプリケーションデリゲートの名前。 – Oliver

+0

正しいことは、ライブラリのユーザーにアプリケーションデリゲートにプロトコルを実装するよう要求することです。私は私の答えを更新します。 –

+0

私は同意しますが、特定の呼び出しが汎用オブジェクトにトリガーされたときに発生する、特定のケースでのみ呼び出されるメソッドをアプリケーションに実装させることはできません。ジェネリッククラスで実装されている他のすべてのメソッドについては、それは役に立たない。だから私は、アプリケーションの代理人がそのメソッドを実装しているかどうかを確認し、そうでない場合は、3番目のルートに移動することをお勧めします。 – Oliver

関連する問題