Wie Sie Ihr eigenes Protokoll mit delegierten erstellen

Selbst in den einfachen Tutorial finden Sie die Verwendung von Protokollen. Es wird sicherlich für viele in Ihrer View-Controller zufällig ein Protokoll verwenden, verteilen, neben der Definition der Schnittstelle, eine Anweisung ähnlich:

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


Die Protokolle (im obigen Beispiel <UIWebViewDelegate> ) sind eine besondere Art von Objective-C, um das Verhalten einer Klasse in eine andere übernehmen. Im obigen Beispiel unsere View-Controller gezeigt verwaltet eine Komponente wahrscheinlich UIWebView . Bei der Beantwortung der Ereignisse des letzteren enthält das Protokoll UIWebViewDelegate .
, come ad esempio: So das Protokoll implementiert UIWebViewDelegate in unserem View-Controller, können wir in der Datei abgelegt m Bereitstellungsmethoden (Nachrichten), die von der Komponente aufgerufen wird. UIWebView , wie zB:

1
2
3
void ) webViewDidFinishLoad : ( UIWebView * ) webView { - (Void) webViewDidFinishLoad: (UIWebView *) {WebView
/ / Lade komplette Seite
}

Mit anderen Worten, teilt unsere View-Controller die Schnittstelle <UIWebViewDelegate> , dass "einige"-Funktion übernimmt.

Schreiben Sie Ihre eigene Protokoll

. Stell dir vor, wir haben zwei Klassen: ClasseA und ClasseB . che, a sua volta, genera un messaggio quando accade un determinato evento. Die Klasse ClasseA instanziiert im ClasseB , was wiederum erzeugt eine Nachricht, wenn ein bestimmtes Ereignis eintritt. per rispondere e intercettare gli “eventi” rilasciati da ClasseB . Wir würden dann schreiben Sie einen Delegaten für ClasseB , die durch verwendet werden können ClasseA zu reagieren und fangen die "Ereignisse" ausgestellt ClasseB .
: Das erste, was zu tun ist, fügen Sie die Definition des Protokolls in ClasseB zusammen mit einer Eigenschaft (in der Standard-Apple) delegate :

1
2
3
4
5
6
7
8
9
10
11
@ Protocol ClasseBDelegate <NSObject>
@ Optional
void ) mioEvento : ( id ) sender; - (Void) mioEvento: (id) sender;
@ End

NSObject { @ Interface ClasseB: NSObject {
/ / Andere Definitionen
id <ClasseBDelegate> delegiert;
}

assign ) id <ClasseBDelegate> delegate; @ Property (zuordnen) id delegieren <ClasseBDelegate>;

. Wie eine Selbstverständlichkeit, in der Datei M von ClasseB eingeben:

1
@ Synthesize delegieren;

In der Klasse Implementierungsdatei ClasseB können wir setzen das "Feuer" unserer Veranstaltung auf diese Weise:

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

: [self.delegate respondsToSelector:@selector(mioEvento:)] . Zuerst müssen wir sicherstellen, dass Sie ein Delegierter fest: self.delegate != NULL und die dieser Delegat stellt, oder wahrscheinlich auf die Nachricht antworten mioEvento : [self.delegate respondsToSelector:@selector(mioEvento:)] . ) che è il puntatore all'istanza della classe ClassB . Wenn beide Bedingungen erfüllt sind und rufen Sie dann mioEvento in diesem Beispiel dieser Veranstaltung auch ein Parameter ( id ), die den Zeiger auf die Instanz der Klasse ist ClassB .
: Die Klasse ClassA nicht tun müssen, ist der Delegierte Methode zu implementieren, und geben Sie mioEvento :

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

NSObject <ClasseBDelegate> { @ Interface ClassA: NSObject {<ClasseBDelegate>
...
}

void ) mioEvento : ( id ) sender; - (Void) mioEvento: (id) sender;

In der Implementierung-Datei, wenn wir erstellen ClassB verwenden:

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

Dann legen:

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

6 Kommentare zu "Wie man ein Protokoll mit ihren eigenen Vertreter zu schaffen"

  1. 6. Januar 2011 Louis:

    Hallo,
    Artikel Komplimente!
    Ich wollte meine Zweifel über die Verwendung zu klären ...

    Der Delegierte ist in der Regel aufgerufen, wenn ein Ereignis in diesem Fall passiert ... er hat uns geschaffen, "delegieren" die Methode "mioEvento" muss von Hand aufgerufen werden?
    Ich verstand nicht, diesen Schritt
    Danke.

  2. 9. Januar 2011 Giovambattista Fazioli :

    @ Louis: Ja, die Klasse, die das Protokoll, das wir geschaffen unterstützt wird auch die Aufgabe haben, die delegate-Methode aufrufen. Wie oben in unsere Klasse gezeigt, den Vorfall Veranstaltung Code wie ausführen:

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

    Das heißt, wenn Sie einen Delegaten und Delegierter unterstützen die angeforderte Methode, dann die Methode ausgeführt wird eingestellt haben.
    Im Prinzip pesonal Klassen, von mittlerer Komplexität, muss - in diesem Fall - ein supportatre über ihre Protokoll-Zustände und Ereignisse der Klasse.
    Wenn Sie weitere Fragen sowie zu schreiben.

  3. 9. Januar 2011 Louis:

    Vielen Dank ...
    Ich gebe Ihnen noch eine Frage ... ergibt sich aus der Tatsache, dass habe ich nicht eine Hand in den Code und vielleicht schießen Unsinn : D

    Erstelle ich meine eigene Protokoll und lassen Sie uns annehmen, dass der Vorfall dieser Veranstaltung, die ich eine besondere Methode des Protokolls erinnern, wie Sie gerichtet haben.
    Die Durchführung des Verfahrens wird im Laufe tun. M meiner Protokoll

    Wenn ich eine Methode, die Teil meiner Bevollmächtigenden Klasse ist (dh eine, die die Delegaten verwendet)-Aufruf haben wie vorgehen?
    Ich habe meine eigene Idee, aber ich möchte nicht bagianate schreiben

  4. 9. Januar 2011 Giovambattista Fazioli :

    @ Louis: Wenn ich Ihre Frage verstehe, würden Sie in der Regel vor zwei Fälle zu finden. In der Regel haben Sie eine View-Controller zusätzlich zu dem Objekt, das ein bestimmtes Protokoll ist es auch ein Delegierter unterstützt instanziieren. In diesem Fall, wenn Sie die Implementierung der Methode schreiben und hat direkten Zugriff auf die Objekt-Instanz, die das Protokoll zur Verfügung stellt. Dies kann wie folgt zusammengefasst werden:

    1
    2
    3
    UIViewController <myClassADelegate> { @ Interface myViewController: UIViewController {<myClassADelegate>
    MyClass * object;
    }

    e, come detto sopra, se funzngerà anche da delegato per la myClassA nell'implementazione del metodo avrà accesso alla variabile objectA : myViewController instanzierà das Objekt vom Typ myClassA und, wie oben erwähnt, wenn auch ein Delegierter funzngerà myClassA in der Umsetzung der Methode haben Zugriff auf die Variable objectA :

    1
    2
    3
    4
    void ) mioEvento { - (Void) {mioEvento
    / / Do something
    ; [Object myMethod];
    }

    Mit wechselnden In Fällen, in denen die Delegierten eines Objekts ist eine andere Klasse, wie z. B.:

    1
    2
    3
    4
    5
    6
    / / Wir sind in einer View-Controller
    ...
    myClassA alloc ] init ] ; object = [[myClass alloc] init];
    [ [ myClassB alloc ] init ] ; myClassB ObjectBar * = [[myClassB alloc] init];
    ObjectBar objectA.delegate =;
    ...

    . In diesem Fall instanziiert ein View-Controller der Klasse myClassA Hinweis auf diese als Delegierter myClassB . che, ovviamente, non conosce a priopri il puntatore alla myClassA . Die Veranstaltung hob myClassA wird verwaltet werden myClassB , die offensichtlich nicht weiß, der Zeiger auf priopri myClassA .
    qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. In diesem Fall, wenn die Instanz von myClassB muss mit der Instanz interagieren myClassA jemand muss es passieren, ist der Ansicht, dass jemand, der beide Controller kennt. Der obige Code sollte wie folgt sein:

    1
    2
    3
    4
    5
    6
    7
    / / Wir sind in einer View-Controller
    ...
    myClassA alloc ] init ] ; object = [[myClass alloc] init];
    [ [ myClassB alloc ] init ] ; myClassB ObjectBar * = [[myClassB alloc] init];
    objectA ] ; // informa B di A [SetObjectAPointer ObjectBar: Object] / / informiert B von A
    ObjectBar objectA.delegate =;
    ...

    Wenn ich die Frage verstanden ...

  5. 10. Januar 2011 Louis:

    Im ersten Fall ...
    Ich nenne die myMethod Methode, die haben offensichtlich wird eine Implementierung.

    Nun ... in die wir im Namen einer Aktion, die ein Aufruf einer Methode oder die Verwendung eines variablen Gegenwart erfordert in meinen myViewController umsetzen

    Wie kann ich?
    Ich hoffe, dass ich erklärt!

  6. 10. März 2011 Objective-C: Benachrichtigungen und Delegaten | Undolog.com :

    [...] Elegant, klar und einfach zu bedienen, um mit diesen Situationen umzugehen. Wir haben bereits in Erstellen Sie ein Protokoll mit eigenen Delegierten gesprochen. Objective-C können Sie ein Kommunikationsprotokoll, über die eine oder mehrere Klassen definieren [...]

Hinterlasse einen Kommentar

XHTML TAG PERMIT: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> INSERTION CODE:
 <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