Pregunta ¿Qué es un "delegado" en el desarrollo de iPhone de Objective C? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

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


65
2018-03-28 18:54


origen


Respuestas:


Mira esto 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 el Clase de NSURLConnection. NSURLConnection tiene tres delegados 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 delegados recibirán una llamada cuando NSURLConnection encuentre una falla, finalice satisfactoriamente o reciba una respuesta del sitio web, respectivamente.


55
2018-03-28 19:03



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 desde un objeto creado posteriormente.

UN buen ejemplo es UIAlertView. Usted crea un UIAlertView objeto para mostrar un cuadro de mensaje corto a los usuarios, posiblemente dándoles una opción con dos botones como "Aceptar" y "Cancelar". los 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 self puntero a UIAlertView como un objeto delegado, y a cambio usted acepta (declarando el UIAlertViewDelegate en el archivo de encabezado de su objeto) para implementar algunos métodos que UIAlertView puede llamar, como alertView:clickedButtonAtIndex:.

Revisa esta publicación para una introducción rápida de alto nivel al patrón de diseño delegado y otras técnicas de devolución de llamada.

Referencias


77
2018-03-28 21:12



Los delegados son un patrón de diseño; no hay sintaxis 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.


20
2018-03-28 18:56



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


5
2018-03-28 18:57



Intento elaborarlo a través de un programa simple

Dos clases

Student.h

#import <Foundation/Foundation.h>

@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 <Foundation/Foundation.h>
#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 <Foundation/Foundation.h>
#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 ejecutará

    1.1 Propiedad del objeto del profesorestudiante'se le asignará un objeto estudiantil.

    1.2 self.student.delegate = self

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

    2.1 [self.delegate respondToSelector:@selector(teacherName)]          Aquí el delegado ya apunta al objeto maestro para que pueda invocar          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 que el objeto de estudiante se llama 'nombre del profesor'método, pero básicamente se realiza por el objeto maestro en sí.


3
2017-08-09 06:29



¡Por favor! compruebe a continuación el sencillo tutorial paso a paso para comprender cómo funcionan los delegados 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 <UIKit/UIKit.h>

@class FirstViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@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 restore 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 <UIKit/UIKit.h>
#import "SecondViewController.h"

@interface FirstViewController : UIViewController<MyDelegate>

@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 <NSObject>

-(NSString *) getMessageString;

@end

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *messageLabel;

@property (nonatomic, retain) id <MyDelegate> 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

3
2018-02-27 12:27



Creo que todas estas respuestas tienen mucho sentido una vez que entiendes a los delegados. 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 delegados a un programador C ++ / Java, diría

Que son los delegados? 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 delegados 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 programadores no son los mejores para mantener este descifrado y proporciona restricciones de compilación para aplicar una implementación limpia.


2
2018-06-20 13:31



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 delegados.

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

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

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


1
2018-03-01 13:17



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


1
2017-07-18 09:19