iOS - Delegati

Esempio per Delegate

Supponiamo che un oggetto A chiami un oggetto B per eseguire un'azione. Una volta completata l'azione, l'oggetto A dovrebbe sapere che B ha completato l'attività e intraprendere l'azione necessaria. Ciò si ottiene con l'aiuto dei delegati.

I concetti chiave nell'esempio precedente sono:

  • A è un oggetto delegato di B.

  • B avrà un riferimento di A.

  • A implementerà i metodi delegati di B.

  • B notificherà ad A tramite i metodi delegato.

Fasi della creazione di un delegato

Step 1 - Per prima cosa, crea un'applicazione a visualizzazione singola.

Step 2 - Quindi seleziona File → Nuovo → File ...

Step 3 - Quindi selezionare Objective C Class e fare clic su Next.

Step 4 - Dai un nome alla classe, ad esempio SampleProtocol con sottoclasse come NSObject come mostrato di seguito.

Step 5 - Quindi seleziona Crea.

Step 6 - Aggiungi un protocollo al file SampleProtocol.h e il codice aggiornato è il seguente -

#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 - Implementa il metodo dell'istanza aggiornando il file SampleProtocol.m come mostrato di seguito.

#import "SampleProtocol.h"

@implementation SampleProtocol

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

Step 8 - Aggiungi un'etichetta UIL in ViewController.xib trascinando l'etichetta dalla libreria di oggetti a UIView come mostrato di seguito.

Step 9 - Creare un IBOutlet per l'etichetta e denominarlo come myLabel e aggiornare il codice come segue per adottare SampleProtocolDelegate in ViewController.h.

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

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

Step 10Implementa il metodo delegato, crea l'oggetto per SampleProtocol e chiama il metodo startSampleProcess. Il file ViewController.m aggiornato è il seguente:

#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 11Vedremo un output come segue. Inizialmente l'etichetta visualizza "elaborazione ...", che viene aggiornato una volta che il metodo delegato viene chiamato dall'oggetto SampleProtocol.