多播委托 – 从iOS中的UI控件接收通知的多个类

我知道UI控件(如UITextField)通过委托来通知客户端交互/事件,它被定义为支持所需协议的类。

我经常发现自己想要在多个类中接收UI事件的通知,所以想要支持多播。 例如,为UI控件指定多个委托。 我很确定,没有支持这个的iOS框架function。 我想知道是否有人提出了一个体面的解决这个问题?

有一个cocoafunction,可以让你相对容易地build立多播委托 – 这是框架中的消息转发系统。

创build一个覆盖forwardInvocation:的类,并返回对象的实例,而不是委托。 这就是有时被称为“蹦床的对象” 。 您的forwardInvocation: implementation中的逻辑现在可以决定哪些“真实”的对象应该接收消息,并将调用转发给其中的一个或多个。

作为接受的答案的更新,我在这里创build了自己的多播委托实现:

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

一种支持多播的技术是给你的委托类以下方法:

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

并将引用存储在NSHashTable

看到这里的实施: http : //arielelkin.github.io/articles/objective-c-multicast-delegate/

您可以在您的类中实现您的UI控件,然后您的类将从此UI接收通知,您可以将消息发送给另一个类(使用相同的委托技术 – 在第一类中实现委托属性,然后在第二类实现委托方法从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里面的(void)textFieldDidEndEditing:(UITextField *)textField ,调用[delegate textFieldDidEndEditing:textField]

二等:

1)实现一级对象,设置委托给自己(到二级)。

2)实现方法 – (void)textFieldDidEndEditing:(UITextField *)textField