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.