6 votes

Délégués multicast - plusieurs classes recevant des notifications de contrôles d'interface utilisateur dans iOS

Je comprends que les contrôles d'interface utilisateur tels que UITextField notifient les interactions/événements du client par l'intermédiaire de leur délégué, qui est défini comme une classe prenant en charge le protocole requis.

Je me suis souvent retrouvé à vouloir recevoir des notifications d'événements d'interface utilisateur dans plus d'une classe, et j'aimerais donc que la multidiffusion soit prise en charge. Par exemple, en spécifiant plus d'un délégué pour un contrôle d'interface utilisateur. Je suis presque sûr qu'il n'y a pas de fonctionnalité du framework iOS qui supporte cela. Je me demandais si quelqu'un avait trouvé une solution décente à ce problème ?

6voto

dasblinkenlight Points 264350

Il existe une fonction de cacao qui vous permet de construire des délégués multicast avec une relative facilité - il s'agit de la fonction Transfert de messages intégré dans le cadre.

Créez une classe qui remplace forwardInvocation: et renvoie une instance de votre objet au lieu d'un délégué. C'est ce que l'on appelle parfois un "Objet trampoline . La logique à l'intérieur de votre forwardInvocation: peut maintenant décider quels objets "réels" doivent recevoir le message et transmettre l'invocation à un ou plusieurs d'entre eux.

En guise de mise à jour de cette réponse acceptée, j'ai créé ma propre implémentation de délégué de multidiffusion ici :

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

1voto

Mikhail Viceman Points 534

Vous pouvez implémenter votre contrôle d'interface utilisateur dans votre classe, puis votre classe recevra une notification de cette interface, vous pouvez envoyer un message à une autre classe (en utilisant la même technique de délégation - implémenter la propriété de délégation dans la première classe, puis dans la deuxième classe implémenter la méthode de délégation de la première classe). Par exemple, pour la méthode UITextField -textFieldDidEndEditing :

En première classe -

1) mettre en œuvre le protocole :

@protocol TextControllerDelegate <NSObject>

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

@end

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

3) dans la méthode - (void)textFieldDidEndEditing:(UITextField *)textField à l'intérieur de la classe, appeler [delegate textFieldDidEndEditing:textField]

En deuxième classe :

1) mettre en œuvre un objet de la première classe, attribuer un délégué à soi-même (à la deuxième classe).

2) mettre en œuvre la méthode - (void)textFieldDidEndEditing:(UITextField *)textField

1voto

Eric Points 1892

Une technique permettant de prendre en charge la multidiffusion consiste à doter votre classe de délégation des méthodes suivantes :

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

Et stocker la référence aux délégués dans un NSHashTable .

Voir la mise en œuvre ici : http://arielelkin.github.io/articles/objective-c-multicast-delegate/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X