Come creare un proprio protocollo con delegato

mercoledì 10 febbraio, 2010

Anche nei tutorial più semplici è possibile incontrare l’uso dei protocolli. Sarà certamente capitato a molti di utilizzare nel vostro view controller un protocollo, inserendo, accanto alla definzione dell’interfaccia, una dicitura simile a:

1
2
3
@interface myViewController : UIViewController <UIWebViewDelegate> {
...
}

I protocolli (nell’esempio sopra <UIWebViewDelegate>) sono un particolare modo di Objective-C di far ereditare comportamenti di una classe in un’altra. Nell’esempio mostrato sopra il nostro view controller probabilmente gestisce un componente UIWebView. Volendo rispondere agli eventi di quest’ultimo ne incorpora il protocollo UIWebViewDelegate.
Così, implementato il protocollo UIWebViewDelegate nel nostro view controller, possiamo inserire nel file .m di implementazione i metodi (messaggi) che saranno invocati dal componente UIWebView, come ad esempio:

1
2
3
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// Caricamento pagina terminato
}

In altre parole il nostro view controller condivide l’interfaccia <UIWebViewDelegate>, cioè ne eredita “alcune” caratteristice.

Scrivere un nostro protocollo

Immaginiamo di avere due classi: ClasseA e ClasseB. La classe ClasseA istanzia al suo interno la ClasseB che, a sua volta, genera un messaggio quando accade un determinato evento. Vorremo quindi scrivere un delegato per la ClasseB tale che possa essere utilizzato da ClasseA per rispondere e intercettare gli “eventi” rilasciati da ClasseB.
La prima cosa da fare è aggiungere la definizione del protocollo nella ClasseB insieme ad una property (nello standard Apple) delegate:

1
2
3
4
5
6
7
8
9
10
11
@protocol ClasseBDelegate <NSObject>
@optional
- (void)mioEvento:(id)sender;
@end

@interface ClasseB : NSObject {
    // altre definizioni
    id <ClasseBDelegate> delegate;
}

@property (assign) id <ClasseBDelegate> delegate;

Come da prassi, nel file .m della ClasseB inserire:

1
@synthesize delegate;

Nel file di implementazione della classe ClasseB possiamo inserire il “fire” del nostro evento in questo modo:

1
2
3
if (self.delegate != NULL && [self.delegate respondsToSelector:@selector(mioEvento:)]) {
    [delegate mioEvento:self];
}

Prima di tutto verifichiamo che sia stato impostato un delegato: self.delegate != NULL e che questo delegato fornisca, o possa rispondere, al messaggio mioEvento: [self.delegate respondsToSelector:@selector(mioEvento:)]. Se entrambi le condizioni sono verificate allora viene invocato mioEvento; in questo esempio questo evento prevede anche un parametro (id) che è il puntatore all’istanza della classe ClassB.
La classe ClassA non dovrà far altro che implementare il delegato e inserire il metodo mioEvento:

1
2
3
4
5
6
7
#import "ClasseB.h"

@interface ClasseA : NSObject <ClasseBDelegate> {
...
}

- (void)mioEvento:(id)sender;

Nel file di implementazione quando creiamo la ClassB useremo:

1
2
ClasseB *classeB = [ClasseB alloc];
[classeB setDelegate: self];

Poi, inseriremo:

1
2
3
- (void)mioEvento:(id)sender {
    NSLog(@"mioEvento");
}

Post correlati

Questo articolo ti è stato utile?: Per nientePocoAbbastanzaMoltoMoltissimo
Loading ... Loading ...

Non ci sono commenti per questo Post

Lascia un commento

TAG XHTML PERMESSI: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERIMENTO CODICE:
<pre></pre>                                  // blocco generico
<code></code>                                // blocco generico
[cc_actionscript][/cc_actionscript]          // Actionscript
[cc_actionscript3][/cc_actionscript3]        // Actionscript 3
[cc_css][/cc_css]                            // CSS Style Sheet
[cc_html][/cc_html]                          // HTML
[cc_js][/cc_js]                              // Javascript
[cc_objc][/cc_objc]                          // Objective-C
[cc_php][/cc_objc]                           // PHP
[cc_sql][/cc_sql]                            // SQL