Um zu verstehen delegates
, muss man verstehen protocols
.
A protocol
ist wie ein Servicevertrag. Wenn ein Objekt (meistens eine UIViewController
Unterklasse, aber nicht immer) diesen Vertrag unterschreibt, heißt es "Ich bin daran interessiert, Logik zur Unterstützung der Nachricht bereitzustellen, die Sie mir senden". Dies ähnelt der NSNotificationCenter
Anmeldung für eine bestimmte Interessenstufe. Der Unterschied besteht darin, dass ein Objekt, das eine Delegierung verwendet, jeweils nur eines haben kann delegate
, wobei sich mehrere Objekte für dasselbe anmelden können NSNotification
.
Apple verwendet die Delegierung allgegenwärtig. Immer mehr, aber sind Sie sehen Apple eine Menge ihrer API über bewegen blocks
, die ähnlich sind , callbacks
in anderen Sprachen.
Abgesehen davon hilft die Delegierung bei der Aufrechterhaltung der MVC, obwohl ich behaupten würde, dass die Delegierung ein Entwurfsmuster für sich ist. Es hilft, Modelle von Controllern zu trennen. Wie in John Cartwrights Beispiel UITableView
weiß a, wie Zeilen und Abschnitte angezeigt werden. Es kann UITableViewCells
aus Leistungsgründen wiederverwendet werden. Es kennt alle anderen Dinge, die man UIScrollView
kennt. Es weiß jedoch nicht, welche Zellen angezeigt werden sollen. Er weiß nicht , was diese Zellen besiedeln mit. Es weiß nicht, welche Zellen für eine bestimmte wiederverwendet werden sollen NSIndexPath
. Dies sollte sowieso wirklich die Aufgabe des Controllers sein. Durch die Delegierung kann die Tabellenansicht diese Nichtansichtslogik auf ein Objekt auslagern, das diese Verantwortung sowieso haben sollte.
Darüber hinaus sind Sie während der gesamten Lebensdauer eines Objekts nicht an einen Delegaten gebunden. Sie können sehr leicht mehrere Datenquellen für eine bestimmte haben UITableView
und diese zur Laufzeit nach Bedarf umschalten.
Einerseits eignet sich die Delegierung hervorragend, um Daten von einem Objekt bereitzustellen und auf Interaktionen zu reagieren. Sie werden es in vielen UIKit Klassen sehen, wie ein UITableView
, UIPickerView
, UICollectionView
etc.
Die Delegierung ist jedoch auch sehr nützlich, wenn Sie Informationen zwischen Objekten übertragen möchten. Sie können ganz einfach Ihre eigenen Protokolle erstellen und Ihre eigenen Objekte registrieren, um ihnen zu folgen. Darüber hinaus sind Protokollmethoden @required
standardmäßig verfügbar, Sie können jedoch einige Methoden angeben@optional
. Dies kann Ihnen eine schöne Flexibilität geben, wenn Sie es brauchen. Angenommen, Sie haben einen übergeordneten Ansichtscontroller und einen untergeordneten Ansichtscontroller. Möglicherweise verwenden Sie dazu die neue Containment-API. Wenn Sie Informationen vom Elternteil an das Kind übergeben müssen, tun Sie dies normalerweise mit einer Eigenschaft. Erledigt. Was aber, wenn Sie Informationen vom Kind an die Eltern zurückgeben müssen? Möglicherweise ändert sich etwas am Kind und Sie müssen das Elternteil benachrichtigen. Sicher, Sie könnten KVO für bestimmte Werte durchführen. Aber vielleicht möchten Sie wissen, wann eine Taste gedrückt wird. Erstellen Sie einfach ein neues Protokoll im Child View Controller
@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end
@interface MyChildViewController : UIViewController
@property (weak, nonatomic) id <MyChildDelegate> delegate;
@end
Wenn Sie in MyChildViewController auf Ihre Schaltfläche tippen, überprüfen Sie einfach, ob Ihr Delegat auf die Delegatennachricht reagiert (wenn dies erforderlich ist und Ihr Delegat die Methode nicht implementiert, stürzen Sie ab. Sie können die Methode @optional
bei Bedarf erstellen) und senden es:
- (IBAction)someButtonTapped:(id)sender {
if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
[self.delegate buttonWasTappedInChild:self];
}
}
Setzen Sie dann den Delegaten Ihres MyChildViewControllers auf self
und implementieren Sie ihn - (void)buttonWasTappedInChild:(MyChildViewController *)childViewController
in Ihrem übergeordneten View Controller. BOOM! Sie haben Informationen, die von einem Kind an das Elternteil weitergegeben wurden. Die Beziehung zwischen den beiden Objekten muss nicht einmal so eng sein wie die von Eltern / Kind. Es handelt sich um einen Servicevertrag. Solange das Objekt, das sich anmeldet, durch die Implementierung der erforderlichen Methoden das Ende des Geschäftes erreicht, sind Sie goldrichtig!
HINWEIS: Delegaten sollten schwach sein / Eigenschaften zuweisen, andernfalls treten Sie in einen Aufbewahrungszyklus ein, in dem kein Objekt freigegeben werden kann.
Hoffe das hilft!