iOS: delegados

Ejemplo de delegado

Supongamos que un objeto A llama a un objeto B para realizar una acción. Una vez que se completa la acción, el objeto A debe saber que B ha completado la tarea y tomar la acción necesaria. Esto se logra con la ayuda de los delegados.

Los conceptos clave en el ejemplo anterior son:

  • A es un objeto delegado de B.

  • B tendrá una referencia de A.

  • A implementará los métodos delegados de B.

  • B notificará a A a través de los métodos de delegado.

Pasos para crear un delegado

Step 1 - Primero, cree una aplicación de vista única.

Step 2 - Luego seleccione Archivo → Nuevo → Archivo ...

Step 3 - A continuación, seleccione Objective C Class y haga clic en Siguiente.

Step 4 - Dé un nombre a la clase, por ejemplo, SampleProtocol con subclase como NSObject como se muestra a continuación.

Step 5 - Luego seleccione crear.

Step 6 - Agregue un protocolo al archivo SampleProtocol.h y el código actualizado es el siguiente:

#import <Foundation/Foundation.h>

// Protocol definition starts here 
@protocol SampleProtocolDelegate <NSObject>
@required
- (void) processCompleted;
@end

// Protocol Definition ends here
@interface SampleProtocol : NSObject {
   // Delegate to respond back
   id <SampleProtocolDelegate> _delegate; 
}
@property (nonatomic,strong) id delegate;

-(void)startSampleProcess; // Instance method
@end

Step 7 - Implemente el método de instancia actualizando el archivo SampleProtocol.m como se muestra a continuación.

#import "SampleProtocol.h"

@implementation SampleProtocol

-(void)startSampleProcess {
   [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate 
	selector:@selector(processCompleted) userInfo:nil repeats:NO];
}
@end

Step 8 - Agregue un UILabel en ViewController.xib arrastrando la etiqueta desde la biblioteca de objetos a UIView como se muestra a continuación.

Step 9 - Cree un IBOutlet para la etiqueta y asígnele el nombre myLabel y actualice el código de la siguiente manera para adoptar SampleProtocolDelegate en ViewController.h.

#import <UIKit/UIKit.h>
#import "SampleProtocol.h"

@interface ViewController : UIViewController<SampleProtocolDelegate> {
   IBOutlet UILabel *myLabel;
}
@end

Step 10Implemente el método delegado, cree un objeto para SampleProtocol y llame al método startSampleProcess. El archivo ViewController.m actualizado es el siguiente:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init];
   sampleProtocol.delegate = self;
   [myLabel setText:@"Processing..."];
   [sampleProtocol startSampleProcess];
   // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
   // Dispose of any resources that can be recreated.
}

#pragma mark - Sample protocol delegate
-(void)processCompleted {
   [myLabel setText:@"Process Completed"];
}
@end

Step 11Veremos una salida como sigue. Inicialmente, la etiqueta muestra "procesando ...", que se actualiza una vez que el objeto SampleProtocol llama al método delegado.