6

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

我经常发现自己希望在不止一个类中接收 UI 事件的通知,因此希望支持多播。例如,为一个 UI 控件指定多个委托。我很确定没有支持此功能的 iOS 框架功能。我想知道是否有人提出了一个体面的解决方案来解决这个问题?

4

3 回答 3

6

有一个可可功能可以让您相对轻松地构建多播委托 - 它是框架中内置的消息转发系统。

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

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

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

于 2012-09-10T10:44:17.043 回答
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/

于 2014-06-16T23:24:40.050 回答
1

您可以在您的类中实现您的 UI 控件,然后您的类将从该 UI 接收通知,您可以向另一个类发送消息(使用相同的委托技术 - 在第一类中实现委托属性,然后在第二类中实现委托方法从一等)。例如,对于 UITextField 方法 -textFieldDidEndEditing:

头等舱——

1)实现协议:

@protocol TextControllerDelegate <NSObject>

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

@end

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

3)in method -(void)textFieldDidEndEditing:(UITextField *)textField在类内部,调用[delegate textFieldDidEndEditing:textField]

二等舱:

1)实现第一类的对象,将委托设置为自我(第二类)。

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

于 2012-09-10T11:03:12.917 回答