2012-09-10 8 views
5

UITextFieldなどのUIコントロールは、必要なプロトコルをサポートするクラスとして定義されたデリゲートを介してクライアントのやり取り/イベントを通知することを理解しています。マルチキャストデリゲート - iOSのUIコントロールからの通知を受け取る複数のクラス

私はしばしば、複数のクラスでUIイベントの通知を受け取りたいと思っているので、マルチキャストをサポートしたいと考えています。たとえば、UIコントロールに複数のデリゲートを指定します。これをサポートするiOSフレームワーク機能はないと確信しています。私は誰もがこの問題のまともな解決策を考え出したのだろうかと思っていましたか?

答えて

6

比較的簡単にマルチキャストデリゲートを作成できるココア機能があります。Message Forwardingシステムがフレームワークに組み込まれています。

forwardInvocation:をオーバーライドするクラスを作成し、デリゲートの代わりにオブジェクトのインスタンスを返します。これは時には「トランポリンオブジェクト」と呼ばれるものです。 forwardInvocation:実装内のロジックは、どの「実際の」オブジェクトがメッセージを受け取るべきかを決定し、それらの1つ以上に呼び出しを転送することができます。この受け入れ答えに更新として

は、私はここに私自身のマルチキャストデリゲートの実装を作成しました:

http://www.scottlogic.co.uk/blog/colin/2012/11/a-multicast-delegate-pattern-for-ios-controls/

+0

ありがとう:

は、ここに実装を参照してください。私はこれを使用して必要なものを作ることができると思う。 – ColinE

+0

Collinの例では、欠けていることがあります。これを追加する必要があります:signature = [NSMethodSignature signatureWithObjCTypes: "@^v^c"]; (NSMethodSignature *)メソッドのシグネチャForSelector:(SEL)aSelectorメソッド。 – iosDeveloper

1

をあなたのクラスであなたのUIコントロールを実装することができ、その後、あなたのクラスは、このUIからの通知を受け取ります別のクラスにメッセージを送ることができます(同じデリゲートテクニックを使用して、ファーストクラスのデリゲートプロパティを実装してから、2番目のクラスは1番目のクラスのデリゲートメソッドを実装します)。例えば 、UITextFieldの方法-textFieldDidEndEditingのため:最初のクラスで

-

1)プロトコルを実装:

@protocol TextControllerDelegate <NSObject> 

@optional // Delegate protocols 
- (void)textFieldDidEndEditing:(UITextField *)textField; 

@end 

2)@property (nonatomic, unsafe_unretained, readwrite) id <TextControllerDelegate> delegate;

3)の方法で - (void)textFieldDidEndEditing:(UITextField *)textFieldクラス内部、電話[delegate textFieldDidEndEditing:textField]

第2クラス:

1)第1クラスのオブジェクトを実装し、代理人を自己(第2クラス)に設定します。

2)を実装する方法 - マルチキャストをサポートするための(void)textFieldDidEndEditing:(UITextField *)textField

2

一つの技術は、あなたの委譲クラスに次のメソッドを与えることです:

@interface Delegator : NSObject - (void)addDelegate:(id<MyProtocol>)delegate; - (void)removeDelegate:(id<MyProtocol>)delegate; @end

そしてNSHashTableに代表団への参照を格納します。私は気づいていなかった非常に興味深い言語機能を強調するための http://arielelkin.github.io/articles/objective-c-multicast-delegate/

関連する問題