2012-09-10 30 views
5

Entiendo que los controles de IU como UITextField notifican las interacciones/eventos del cliente a través de su delegado, que se define como una clase que admite el protocolo requerido.Delegados de multidifusión: varias clases que reciben notificaciones de controles de IU en iOS

A menudo me he encontrado queriendo recibir notificaciones de eventos de UI en más de una clase, por lo que querría admitir multicasting. Por ejemplo, especificando más de un delegado para un control de UI. Estoy bastante seguro de que no hay una función de marco de iOS que admita esto. Me preguntaba si alguien había encontrado una solución decente para este problema.

Respuesta

6

Hay una función de cacao que le permite crear delegados de multidifusión con relativa facilidad: es el sistema Message Forwarding integrado en el marco.

Haz una clase que anule forwardInvocation: y devuelve una instancia de tu objeto en lugar de un delegado. Esto es lo que a veces se llama "Objeto de trampolín". La lógica dentro de su implementación forwardInvocation: ahora puede decidir qué objetos "reales" deberían recibir el mensaje y reenviar la invocación a uno o más de ellos.

como una actualización de esta respuesta aceptada, he creado mi propia implementación de multidifusión delegado aquí:

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

+0

Gracias para resaltar una característica del lenguaje muy interesante que yo no era consciente. Creo que puedo construir lo que necesito para usar esto. – ColinE

+0

En el ejemplo de Collin, falta algo. Necesita agregar esto: signature = [NSMethodSignature signatureWithObjCTypes: "@^v^c"]; a (NSMethodSignature *) methodSignatureForSelector: (SEL) un método de selección. – iosDeveloper

1

podría implementar el control de la interfaz de usuario en su clase, y luego su clase recibirá la notificación de esta interfaz de usuario , puede enviar un mensaje a otra clase (usando la misma técnica de delegado - implementar la propiedad de delegado en primera clase, y luego en la segunda clase implementar el método de delegado desde la clase 1ra). Por ejemplo, para el método de UITextField -textFieldDidEndEditing:

En primera clase -

1) aplicar protocolo:

@protocol TextControllerDelegate <NSObject> 

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

@end 

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

3) en el método - (void)textFieldDidEndEditing:(UITextField *)textField dentro de la clase , llame al [delegate textFieldDidEndEditing:textField]

En la segunda clase:

1) implementar el objeto de primera clase, establecer delegar a sí mismo (a segunda clase).

2) implementar el método - (void)textFieldDidEndEditing:(UITextField *)textField

2

Una técnica para apoyar la multidifusión es dar a su clase que delega los métodos siguientes:

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

y almacenar la referencia a los delegados en un NSHashTable.

Véase la aplicación aquí: http://arielelkin.github.io/articles/objective-c-multicast-delegate/

Cuestiones relacionadas