繁体   English   中英

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

[英]Multicast delegates - multiple classes receiving notifications from UI controls in iOS

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

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

有一个cocoa功能可以让你相对轻松地构建多播委托 - 它是框架中内置的Message Forwarding系统。

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

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

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

您可以在类中实现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)在方法 - (void)textFieldDidEndEditing:(UITextField *)textField类中的(void)textFieldDidEndEditing:(UITextField *)textField ,调用[delegate textFieldDidEndEditing:textField]

在第二课:

1)实现第一类对象,将委托设置为self(到第二类)。

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

支持多播的一种技术是为您的委托类提供以下方法:

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

并在NSHashTable存储对NSHashTable

请参阅此处的实施: http//arielelkin.github.io/articles/objective-c-multicast-delegate/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM