iOS - Delegados

Exemplo para Delegado

Vamos supor que um objeto A chame um objeto B para realizar uma ação. Assim que a ação for concluída, o objeto A deve saber que B concluiu a tarefa e tomar as medidas necessárias. Isso é conseguido com a ajuda de delegados.

Os conceitos-chave no exemplo acima são -

  • A é um objeto delegado de B.

  • B terá uma referência de A.

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

  • B notificará A por meio dos métodos de delegação.

Etapas na criação de um delegado

Step 1 - Primeiro, crie um aplicativo de visualização única.

Step 2 - Em seguida, selecione Arquivo → Novo → Arquivo ...

Step 3 - Em seguida, selecione Objective C Class e clique em Next.

Step 4 - Dê um nome à classe, digamos, SampleProtocol com subclasse como NSObject, conforme mostrado abaixo.

Step 5 - Em seguida, selecione criar.

Step 6 - Adicione um protocolo ao arquivo SampleProtocol.h e o código atualizado é o seguinte -

#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 o método de instância atualizando o arquivo SampleProtocol.m conforme mostrado abaixo.

#import "SampleProtocol.h"

@implementation SampleProtocol

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

Step 8 - Adicione um UILabel no ViewController.xib arrastando o rótulo da biblioteca de objetos para UIView como mostrado abaixo.

Step 9 - Crie um IBOutlet para o rótulo e nomeie-o como myLabel e atualize o código conforme a seguir para adotar SampleProtocolDelegate em ViewController.h.

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

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

Step 10Implemente o método delegado, crie o objeto para SampleProtocol e chame o método startSampleProcess. O arquivo ViewController.m atualizado é o seguinte -

#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 uma saída da seguinte forma. Inicialmente, o rótulo exibe "processing ...", que é atualizado assim que o método delegado é chamado pelo objeto SampleProtocol.