我了解 UI 控件(例如 UITextField)通过其委托通知客户端交互/事件,该委托被定义为支持所需协议的类。
我经常发现自己希望在不止一个类中接收 UI 事件的通知,因此希望支持多播。例如,为一个 UI 控件指定多个委托。我很确定没有支持此功能的 iOS 框架功能。我想知道是否有人提出了一个体面的解决方案来解决这个问题?
我了解 UI 控件(例如 UITextField)通过其委托通知客户端交互/事件,该委托被定义为支持所需协议的类。
我经常发现自己希望在不止一个类中接收 UI 事件的通知,因此希望支持多播。例如,为一个 UI 控件指定多个委托。我很确定没有支持此功能的 iOS 框架功能。我想知道是否有人提出了一个体面的解决方案来解决这个问题?
有一个可可功能可以让您相对轻松地构建多播委托 - 它是框架中内置的消息转发系统。
创建一个覆盖 的类forwardInvocation:
,并返回对象的实例而不是委托。这就是有时被称为“蹦床物体”的东西。您的实现中的逻辑forwardInvocation:
现在可以决定哪些“真实”对象应该接收消息,并将调用转发给其中一个或多个。
作为对这个已接受答案的更新,我在这里创建了自己的多播委托实现:
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 接收通知,您可以向另一个类发送消息(使用相同的委托技术 - 在第一类中实现委托属性,然后在第二类中实现委托方法从一等)。例如,对于 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