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 |
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"); } |










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.
@ 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:
2
3
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.
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
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
@ 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:
2
3
MyClass * object;
}
e, come detto sopra, se funzngerà anche da delegato per la
myClassAnell'implementazione del metodo avrà accesso alla variabileobjectA:myViewControllerinstanzierà das Objekt vom TypmyClassAund, wie oben erwähnt, wenn auch ein Delegierter funzngeràmyClassAin der Umsetzung der Methode haben Zugriff auf die VariableobjectA:2
3
4
/ / Do something
; [Object myMethod];
}
Mit wechselnden In Fällen, in denen die Delegierten eines Objekts ist eine andere Klasse, wie z. B.:
2
3
4
5
6
...
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
myClassAHinweis auf diese als DelegiertermyClassB. che, ovviamente, non conosce a priopri il puntatore allamyClassA. Die Veranstaltung hobmyClassAwird verwaltet werdenmyClassB, die offensichtlich nicht weiß, der Zeiger auf prioprimyClassA.qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. In diesem Fall, wenn die Instanz von
myClassBmuss mit der Instanz interagierenmyClassAjemand muss es passieren, ist der Ansicht, dass jemand, der beide Controller kennt. Der obige Code sollte wie folgt sein:2
3
4
5
6
7
...
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 ...
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!
[...] 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 [...]