UITextFieldなどのUIコントロールは、必要なプロトコルをサポートするクラスとして定義されているデリゲートを介してクライアントの相互作用/イベントを通知することを理解しています。
UIイベントの通知を複数のクラスで受け取りたいと思うことがよくあるので、マルチキャストをサポートしたいと思います。たとえば、UIコントロールに複数のデリゲートを指定します。これをサポートするiOSフレームワーク機能はないと確信しています。誰かがこの問題のまともな解決策を思いついたのだろうかと思っていましたか?
UITextFieldなどのUIコントロールは、必要なプロトコルをサポートするクラスとして定義されているデリゲートを介してクライアントの相互作用/イベントを通知することを理解しています。
UIイベントの通知を複数のクラスで受け取りたいと思うことがよくあるので、マルチキャストをサポートしたいと思います。たとえば、UIコントロールに複数のデリゲートを指定します。これをサポートするiOSフレームワーク機能はないと確信しています。誰かがこの問題のまともな解決策を思いついたのだろうかと思っていましたか?
マルチキャストデリゲートを比較的簡単に構築できるココア機能があります。これは、フレームワークに組み込まれているメッセージ転送システムです。
をオーバーライドするクラスを作成しforwardInvocation:、デリゲートの代わりにオブジェクトのインスタンスを返します。これは、 「トランポリンオブジェクト」と呼ばれることもあります。実装内のロジックは、forwardInvocation:どの「実際の」オブジェクトがメッセージを受信するかを決定し、呼び出しを1つ以上のオブジェクトに転送できるようになりました。
この受け入れられた回答の更新として、私はここで独自のマルチキャストデリゲート実装を作成しました。
http://www.scottlogic.co.uk/blog/colin/2012/11/a-multicast-delegate-pattern-for-ios-controls/
クラスにUIコントロールを実装すると、クラスはこのUIから通知を受け取り、別のクラスにメッセージを送信できます(同じデリゲートテクニックを使用して、最初のクラスでデリゲートプロパティを実装し、次に2番目のクラスでデリゲートメソッドを実装します)ファーストクラスから)。たとえば、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)ファーストクラスのオブジェクトを実装し、デリゲートを自分自身に設定します(セカンドクラスに)。
2)メソッドの実装-(void)textFieldDidEndEditing:(UITextField *)textField
マルチキャストをサポートする1つの手法は、委任クラスに次のメソッドを与えることです。
@interface Delegator : NSObject
- (void)addDelegate:(id<MyProtocol>)delegate;
- (void)removeDelegate:(id<MyProtocol>)delegate;
@end
そして、デリゲートへの参照をに保存しますNSHashTable。
ここで実装を参照してください:http: //arielelkin.github.io/articles/objective-c-multicast-delegate/