2009-08-12 15 views
11

No estoy seguro acerca de mi terminología aquí, pero:¿Puede un objeto ser un delegado para delegados múltiples?

Tengo un ViewController en una aplicación de iPhone que necesita ser un delegado para otros dos objetos (delegadores).

¿Esto es posible? Esto no funciona:

@interface my_projectViewController : UIViewController <DelegatorOne> <DelegatorTwo> { 
    ... 
} 

Respuesta

24

El plural es adecuado delegados y sí, por supuesto, puede hacer que la clase sea el delegado para diferentes protocolos.

La sintaxis sin embargo es así:

@interface my_projectViewController : UIViewController <DelegatorOne, DelegatorTwo> { 
    ... 
} 

Tengo uno que se parece a esto:

@interface MyViewController : UIViewController<UITextFieldDelegate,UIWebViewDelegate,UINavigationBarDelegate,UIActionSheetDelegate,URLDownloaderDelegate> { 

} 

Saludos,

3

Su sintaxis no es del todo bien, pero es muy posible tener un solo acto objeto como un delegado para varios clientes.

Algo así como:

@interface MyViewController: UIViewController <protocol1, protocol2> 
{ 
} 
@end 

... debería funcionar

6

diferencia ligeramente pedante, pero importante: lo que usted proporciona en su pregunta no es un objeto que sea un delegado de múltiples delegadores, sino un objeto que se ajuste a múltiples protocolos. En la mayoría de los casos, un delegado tendrá un protocolo asociado (UIActionSheetDelegate, UITextFieldDelegate), pero no todos los delegados tienen protocolos, y no todos los protocolos implican delegados.

En un ejemplo muy artificial, que podría tener un objeto que delegue en otro objeto que se ajusta a ningún protocolo:

#import "ObjectB.h" 

@interface ObjectA : NSObject { 
    ObjectB *delegate; 
} 
@end 

// ... 

@interface ObjectB : NSObject { } 
- (void)delegateMethod; 
@end

En este ejemplo, los casos de Objecta esperan una instancia de ObjectB como su "delegado" , a pesar de que ObjectB no es realmente un protocolo, ¡sino una interfaz de clase! La existencia de un objeto como un delegado es más un estado de ánimo que un requisito estricto para tener un protocolo - es sólo que la mayoría (bueno, casi todos) los desarrolladores tendrán los métodos de delegado y romper a cabo en un protocolo para que varios objetos pueden convertirse en delegados para instancias de ObjectA, en lugar de requerir que el delegado sea una instancia (o subclase) de ObjectB. Esto también elimina la necesidad de que ObjectA "sepa acerca de" ObjectB en el sentido de #import en su archivo de encabezado.

En un ejemplo ligeramente menos artificial, un objeto puede ajustarse a un protocolo sin ser un delegado. Piense en el protocolo NSCopying como un gran ejemplo de esto: todo lo que el protocolo dice que los objetos que lo implementan se puede copiar utilizando el método copy. La gente no considera copy un método "delegado", ya que ningún objeto va a decir [delegate copy] sin hacer algo con esa copia, por lo que los objetos que implementan NSCopying no son realmente objetos "delegados".

Al final, solo recuerde: un protocolo no implica un delegado, y un delegado no siempre (pero generalmente lo hace) implica un protocolo.

+1

Por supuesto, los protocolos informales también se usan comúnmente para los delegados, que es cuando no explícitamente se requieren los métodos como protocolo, pero se espera que conozcan los nombres de los métodos. UIKit y AppKit a menudo usan protocolos informales y simplemente tienen un comportamiento no operativo si la clase no admite el mensaje requerido por el protocolo. – AlBlue

+0

AlBlue: ¡buen punto! Un ejemplo que viene a la mente es NSXMLParser, que no tiene un protocolo formal NSXMLParserDelegate correspondiente, pero documenta un puñado de métodos 'analizador: si ...:'. – Tim

2

Además de lo que se ha dicho sobre la implementación de múltiples protocolos de delegado, el patrón de delegación de Cocoa facilita que un objeto se convierta en un delegado para múltiples objetos del mismo tipo. Esta es la razón por la cual la mayoría de los métodos delegados incluyen un puntero al objeto llamante como parámetro o como el objeto de una NSNotificación. Puede usarlo para obtener más información sobre el objeto o compararlo con una variable de instancia para determinar qué acción tomar.

Cuestiones relacionadas