ios - uiapplication swift
¿Qué es un "delegado" en el desarrollo de iPhone de Objective C? (10)
¡Por favor! compruebe a continuación el sencillo tutorial paso a paso para comprender cómo funcionan los delegados en iOS.
Creé dos ViewControllers (para enviar datos de uno a otro)
- FirstViewController implementa delegado (que proporciona datos).
- 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
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo creo delegados en Objective-C? 19 respuestas
¿Qué es un "delegado" en el desarrollo de iPhone de Objective C?
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
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.
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.
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.
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 :::
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
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.
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.
Un delegado captura las acciones de grabación de un usuario y realiza una Acción particular de acuerdo con el usuario Taping Action.
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 delegados y otras técnicas de devolución de llamada .
Referencias
Ver esta discussion
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 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.