¿Qué es un “delegado” en el desarrollo de iPhone de Objective C?

¿Qué es un “delegado” en el desarrollo de iPhone de Objective C?

Ver esta discusión

Un delegado permite que un objeto envíe mensajes a otro objeto cuando ocurre un evento. Por ejemplo, si está descargando datos de un sitio web de forma asincrónica utilizando la clase NSURLConnection . NSURLConnection tiene tres delegates comunes:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error - (void)connectionDidFinishLoading:(NSURLConnection *)connection - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

Uno o más de estos delegates recibirán una llamada cuando NSURLConnection encuentre una falla, finalice satisfactoriamente o reciba una respuesta del sitio web, respectivamente.

Un delegado es un puntero a un objeto con un conjunto de métodos que el titular del delegado sabe cómo llamar. En otras palabras, es un mecanismo para habilitar devoluciones de llamada específicas de un objeto creado posteriormente.

Un buen ejemplo es UIAlertView . Crea un objeto UIAlertView para mostrar un cuadro de mensaje corto a los usuarios, posiblemente dándoles una opción con dos botones como “Aceptar” y “Cancelar”. UIAlertView necesita una forma de devolverte la llamada, pero no tiene información sobre a qué objeto devolver la llamada ni a qué método llamar.

Para resolver este problema, puede enviar su puntero a UIAlertView como un objeto delegado, y a cambio acepta (al declarar el UIAlertViewDelegate en el archivo de encabezado de su objeto) implementar algunos métodos que UIAlertView puede invocar, como alertView:clickedButtonAtIndex:

Consulte esta publicación para obtener una introducción rápida de alto nivel al patrón de diseño de delegates y otras técnicas de callback .

Referencias

  • Referencia de clase UIAlertView
  • Referencia de clase UIAlertViewDelegate
  • Guía de Apple para delegates y fonts de datos

Los delegates son un patrón de diseño; no hay syntax especial o soporte de idioma.

Un delegado es simplemente un objeto al que otro objeto envía mensajes cuando suceden ciertas cosas, para que el delegado pueda manejar detalles específicos de la aplicación para los que el objeto original no fue diseñado. Es una forma de personalizar el comportamiento sin crear subclases.

Creo que este artículo de Wikipedia lo describe mejor: http://en.wikipedia.org/wiki/Delegation_pattern

Es “solo” una implementación de un patrón de diseño y muy común en Objective-C

Intento elaborarlo a través de un progtwig simple

Dos clases

Student.h

 #import  @interface Student : NSObject @property (weak) id delegate; - (void) studentInfo; @end 

Student.m

 #import "Student.h" @implementation Student - (void) studentInfo { NSString *teacherName; if ([self.delegate respondsToSelector:@selector(teacherName)]) { teacherName = [self.delegate performSelector:@selector(teacherName)]; } NSLog(@"\n Student name is XYZ\n Teacher name is %@",teacherName); } @end 

Profesor.h

 #import  #import "Student.h> @interface Teacher: NSObject @property (strong,nonatomic) Student *student; - (NSString *) teacherName; - (id) initWithStudent:(Student *)student; @end 

Teacher.m

 #import "Teacher.h" @implementation Teacher - (NSString *) teacherName { return @"ABC"; } - (id) initWithStudent:(Student *)student { self = [ super init]; if (self) { self.student = student; self.student.delegate = self; } return self; } @end 

main.m

 #import  #import "Teacher.h" int main ( int argc, const char* argv[]) { @autoreleasepool { Student *student = [[Student alloc] init]; Teacher *teacher = [[Teacher alloc] initWithStudent:student]; [student studentInfo]; } return 0; } 

EXPLICACIÓN :::

  1. Desde el método principal cuando initWithStudent:student se ejecutará

    1.1 La propiedad del objeto del maestro ‘ estudiante ‘ se asignará con el objeto del estudiante.

    1.2 self.student.delegate = self

      means student object's delegate will points to teacher object 
  2. Desde el método principal cuando se [student studentInfo]

    2.1 [self.delegate respondToSelector:@selector(teacherName)] Aquí el delegado ya apunta al objeto del profesor para que pueda invocar el método de instancia ‘teacherName’.

    2.2 entonces [self.delegate performSelector:@selector(teacherName)] se ejecutará fácilmente.

Parece que el objeto Maestro asigna un delegado al objeto del alumno para llamarlo a su propio método.

Es una idea relativa, donde vemos ese objeto de estudiante llamado método ‘ teacherName ‘, pero básicamente lo hace el propio objeto de profesor.

¡Por favor! compruebe a continuación el sencillo tutorial paso a paso para comprender cómo funcionan los delegates en iOS.

Delegado en iOS

Creé dos ViewControllers (para enviar datos de uno a otro)

  1. FirstViewController implementa delegado (que proporciona datos).
  2. SecondViewController declara el delegado (que recibirá los datos).

Aquí está el código de muestra que puede ayudarlo.

AppDelegate.h


 #import  @class FirstViewController; @interface AppDelegate : UIResponder  @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) FirstViewController *firstViewController; @end 

AppDelegate.m


 #import "AppDelegate.h" #import "FirstViewController.h" @implementation AppDelegate @synthesize firstViewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. //create instance of FirstViewController firstViewController = [[FirstViewController alloc] init]; //create UINavigationController instance using firstViewController UINavigationController *firstView = [[UINavigationController alloc] initWithRootViewController:firstViewController]; //added navigation controller to window as a rootViewController self.window.rootViewController = firstView; [self.window makeKeyAndVisible]; return YES; } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restre your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } @end 

FirstViewController.h


 #import  #import "SecondViewController.h" @interface FirstViewController : UIViewController @property (nonatomic, retain) NSString *mesasgeData; @property (weak, nonatomic) IBOutlet UITextField *textField; @property (weak, nonatomic) IBOutlet UIButton *nextButton; - (IBAction)buttonPressed:(id)sender; @property (nonatomic, strong) SecondViewController *secondViewController; @end 

FirstViewController.m


 #import "FirstViewController.h" @interface FirstViewController () @end @implementation FirstViewController @synthesize mesasgeData; @synthesize textField; @synthesize secondViewController; #pragma mark - View Controller's Life Cycle methods - (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } #pragma mark - Button Click event handling method - (IBAction)buttonPressed:(id)sender { //get the input data from text feild and store into string mesasgeData = textField.text; //go keypad back when button clicked from textfield [textField resignFirstResponder]; //crating instance of second view controller secondViewController = [[SecondViewController alloc]init]; //it says SecondViewController is implementing MyDelegate secondViewController.myDelegate = self; //loading new view via navigation controller [self.navigationController pushViewController:secondViewController animated:YES]; } #pragma mark - MyDelegate's method implementation -(NSString *) getMessageString{ return mesasgeData; } @end 

SecondViewController.h


 //declare our own delegate @protocol MyDelegate  -(NSString *) getMessageString; @end #import  @interface SecondViewController : UIViewController @property (weak, nonatomic) IBOutlet UILabel *messageLabel; @property (nonatomic, retain) id  myDelegate; @end 

SecondViewController.m


 #import "SecondViewController.h" @interface SecondViewController () @end @implementation SecondViewController @synthesize messageLabel; @synthesize myDelegate; - (void)viewDidLoad { [super viewDidLoad]; messageLabel.text = [myDelegate getMessageString]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end 

Creo que todas estas respuestas tienen mucho sentido una vez que entiendes a los delegates. Personalmente vine de la tierra de C / C ++ y antes de los lenguajes de procedimiento como Fortran, etc. así que aquí está mi búsqueda de 2 minutos para encontrar análogos similares en el paradigma de C ++.

Si tuviera que explicar los delegates a un progtwigdor C ++ / Java, diría

Que son los delegates? Estos son punteros estáticos para clases dentro de otra clase. Una vez que asigne un puntero, puede llamar a funciones / métodos en esa clase. Por lo tanto, algunas funciones de su clase son “delegadas” (en C ++ world – puntero a por un puntero de objeto de clase) a otra clase.

¿Qué son los protocolos? Conceptualmente, tiene un propósito similar al del archivo de encabezado de la clase que está asignando como clase de delegado. Un protocolo es una forma explícita de definir qué métodos se deben implementar en la clase cuyo puntero se estableció como un delegado dentro de una clase.

¿Cómo puedo hacer algo similar en C ++? Si intentara hacer esto en C ++, definiría punteros a clases (objetos) en la definición de clase y luego los conectaría a otras clases que proporcionarán funciones adicionales como delegates a su clase base. Pero este cableado debe estar dentro del código y será torpe y propenso a errores. Objective C simplemente asume que los progtwigdores no son los mejores para mantener este descifrado y proporciona restricciones de comstackción para aplicar una implementación limpia.

El delegado dispara los eventos automáticos en Objetos C. Si configura el delegado en Objeto, envía el mensaje a otro objeto a través de los métodos delegates.

Es una forma de modificar el comportamiento de una clase sin necesidad de subclases.

Cada Objetos que tiene los métodos delegates. Estos métodos delegates se activan cuando los Objetos particulares participan en la interacción del usuario y el ciclo de flujo del Progtwig.

En pocas palabras: la delegación es una forma de permitir que los objetos interactúen entre sí sin crear fuertes interdependencias entre ellos.

Un delegado captura las acciones de grabación de un usuario y realiza una Acción particular de acuerdo con el usuario Taping Action.

Delegate no es más que una instancia de Object que podemos llamar métodos en nombre de esos Objetos. y también ayuda a crear métodos en rumtime de esos Objetos.