2011-08-27 18 views
27

Acabo de aprender a desarrollar aplicaciones para iPhone pero me cuesta entender qué significa realmente el delegado. ¿Puede alguien decirme con ejemplos qué hace y qué tan importante es? Gracias por cualquier ayuda!¿Qué hace exactamente delegate en el proyecto xcode ios?

+0

Por favor, vea: http://stackoverflow.com/questions/7118598/what-is-the-difference-between-notifications-delegates-and -protocolos y recuerde buscar antes de publicar! :) – Luke

+0

¿Alguna otra pregunta sobre los delegados? La respuesta tiene sentido? – bryanmac

+0

Ver también [enlace] (http://iosdevelopertips.com/objective-c/the-basics-of-protocols-and- delegate.html). – HDdeveloper

Respuesta

41

Es un concepto clave para comprender conceptualmente por lo que es importante tener en cuenta cómo pensar acerca de ello antes de los detalles técnicos. En pocas palabras, un delegado es una devolución de llamada.

dos escenarios principales de usar los delegados:

  1. Una clase o control quiere abstraer los detalles sobre cómo hacer el trabajo (como recuperar los datos).
  2. Permita que otros enganchen código en una tubería.

Ejemplos: UITableView - una vista de tabla es solo un control que sabe cómo presentar una lista de celdas. Maneja todo el trabajo pesado de renderizado, desplazamiento, etc. Pero no tiene idea de cómo cargar sus datos. Así que implementa un delegado de fuente de datos que tiene métodos para obtener los datos de la celda para una fila determinada, etc. Eso hace que sea más fácil para usted. Simplemente use el control y conecte los detalles de sus datos. El UITableView hará todo por usted ... solo responda algunas preguntas específicas. Un delegado responde esas pocas preguntas específicas.

Un control de texto: agrega un control de texto a su vista y ¡listo! puedes escribirlo y todo está bien. Pero, ¿qué sucede si quiere hacer algo cuando comienza a escribir o cuando termina de escribir? Bueno, el control de texto ofrece un delegado con métodos que le permiten enganchar en la tubería de ejecución del control de texto. Le permite al control de texto hacer todo por usted y le permite insertar código donde lo necesite. Muchas veces, hay forma de interponer código para tomar una decisión sobre si algo está permitido. El control devolverá la llamada y preguntará: ¿debería poder hacer x? Puede interponer código e influir en el comportamiento.

Si está creando un control o una clase, puede crear su propio protocolo, delegados de fuentes de datos, etc. ... para que su control se concentre en hacer lo que se anuncia. Por ejemplo, digamos que quería crear un control de tareas. Usted podría:

Primero, cree un contrato. Oye, si vas a proporcionar datos para mi control, estas son las preguntas que te voy a hacer. Lo tomaré a partir de ahí ... En este caso, te preguntaré el número de tareas y haré que me des una tarea dado el número de fila.

@protocol XXTaskBoardDelegate <NSObject> 
-(NSInteger*)getTaskCount; 
-(XXTask*)getTaskForRow:(NSInteger*)rowNumber; 
@end 

en el control o la clase, dar al consumidor una manera de darnos la clase de origen de datos delegado que responderá a las preguntas que el control le preguntará. En este punto, el control es un control puro. No sabe nada sobre cómo obtienes tus datos. Está pidiendo un objeto (id) que implemente un contrato/protocolo. Identificación del

@implementation XXTaskBoard 
- (void)setDelegate:(id<XXTaskBoardDelegate>)newDelegate 
{ 
    // the control stores the delegate so it can callback and ask you questions. 
} 

Entonces, para la clase de delegado, en la cabecera declaro que implementar protocolo formal y en el archivo m aplicación que proporciona el código.

@interface AppController : NSObject<XXTaskBoardDelegate> 
{ 
    //... 
} 

a continuación, ponerlo en práctica en la aplicación

@implementation AppController 
- (NSInteger*)getTaskCount 
{ 
    return [model queryTaskCount]; 
} 

- (XXTask*)getTaskForRow:(NSInteger*)rowNumber 
{ 
    return [[model tasks] getItem:(NSInteger*)rowNumber]; 
} 
10

Un delegado es un objeto al que otra clase puede pasar mensajes. En la práctica, las clases delegadas deben cumplir con un protocolo delegado.

Por ejemplo, tomaremos una subclase de un controlador de vista de tabla. Este es un delegado para su vista de tabla. En primer lugar se define que es una vista de tabla delegado al hacer esto:

MyTableViewController : UITableViewController <UITableViewDelegate> 

Esto dice que la clase MyTableViewController es una subclase de UITableViewController y cumpla con el protocolo UITableViewDelegate.

Configuración [tableView setDelegate:self] (o definirlo como tal en IB) luego pasa el objeto self a la vista de tabla para que la vista de tabla le envíe mensajes.

El mensaje principal que envía es el mensaje didSelectRowAtIndexPath que le dice a su clase que el usuario ha presionado una celda de vista de tabla.

Así que el objeto que toma el evento click (la vista de tabla) pasa el mensaje de que se ha hecho clic en la celda al objeto delegado (que en este caso es su objeto MyTableViewController).

Existen protocolos delegados para que pueda asegurarse de que el objeto delegado tenga los métodos necesarios para manejar sus mensajes. Los métodos en un protocolo de delegado pueden ser @optional o aplicados. Cualquier método que sea opcional no tiene que ser definido. En su clase MyTableViewController, el método didSelectRowAtIndexPath es opcional; no es necesario que lo tenga. Si la vista de tabla no encuentra el método, simplemente no lo llamará.

Sin embargo, el cellForRowAtIndexPath es necesario y sin él su aplicación no compilará.

Espero que esto ayude y sea sencillo para usted. Si necesita más información, hágamelo saber.

3

Los delegados son solo una forma de obtener devoluciones de llamada de algo. Pasas un delegado (un puntero a un objeto que se ajusta a un protocolo) a algo y cuando tiene nuevos datos para ti o cuando ocurre un evento que algo hace que un método llame al delegado.

Por ejemplo, cuando se producen eventos, como que su aplicación se pone en segundo plano o que la aplicación está por terminar, el objeto UIApplication llamará al delegado de su aplicación para avisarle. Cuando un CLLocationManager tiene una nueva posición de GPS llamará a su delegado para pasarle la nueva posición. UITableViews llama a sus delegados para que UITableViewCells se muestre en la tabla. Hay muchos usos de delegados en iOS.

Cuestiones relacionadas