Was ist mit .delegate = selbst gemeint?
-
25-09-2019 - |
Frage
Könnte jemand die Bedeutung von someViewController.delegate = self
und self.delegate
erklären? Wo sie uns helfen?
Lösung
Die Delegierten Senden von Nachrichten Sie.
Zum Beispiel:., Wenn Sie den Beschleunigungsmesser Delegaten verwenden, werden Sie Meldungen über das Beschleunigungsmesser erhalten
Wenn Sie diesen neuen Neutrino-Erkennung Delegaten verwenden, erhalten Sie Meldungen über alle Neutrinos im Bereich nachgewiesen werden.
Wenn Sie PopUps verwenden, PopUps senden Sie Nachrichten. Und die Art und Weise, die getan wird, ist mit den Delegierten PopUp. Es gibt viele, viele Beispiele.
So senden Delegierten Nachrichten.
Es ist so einfach.
Sie könnten fragen: "Woher kommt es, diese Nachrichten zu senden?"
Die Antwort lautet: Es sendet die Nachrichten an, wo Sie setzen die „.delegate“ Dingen
.Wenn Sie „den Delegierten setzen“, was Sie tun, ist zu sagen, wo Sie die Nachrichten gehen wollen.
So
blah.delegate = amazingPlace werden die Nachrichten an "amazingPlace" senden.
blah.delegate = somewhereElse werden die Nachrichten an "somewhereElse" senden.
blah.delegate = selbst die Nachrichten senden ...... Sie .
Sehr oft wollen Sie die Nachrichten auf „Sie“ kommen, so dass man einfach sagen: „blah.delegate = self“
Es ist ein sehr häufiger Fehler, dass die Code-Zeile zu vergessen.
Wenn Sie diese Zeile Code vergessen, Sie sind gestopft. Die Nachrichten gehen Nichts , und Sie Ihren Kopf nach links kratzen versuchen, herauszufinden, was schief gelaufen ist.
Etwas anderes haben Sie zu tun. Wenn Sie einen Delegaten verwenden, müssen Sie vorher bekannt zu geben, dass Sie die Delegierten verwenden
Wie das tun?
In den alten Tagen mit Objective-C, können Sie dies nur tun ...
@interface AppDelegate_Pad : NSObject <UIApplicationDelegate>
@interface BigTop : UIViewController <ASIHTTPRequestDelegate,
UIPopoverControllerDelegate>
@interface Flying : UIViewController <UIAccelerometerDelegate>
Sie sehen, dass ‚BigTop‘ will zwei Delegierte verwenden, nämlich die ASIHTTPRequestDelegate und die UIPopoverControllerDelegate. Während ‚Flying‘ will nur einen Delegierten verwenden -. Er will den Beschleunigungssensor verwenden,
In Swift , es könnte nicht einfacher sein - man muss nur ein Komma hat dann die Protokolle:
class YourClass:UIViewController, SomeDelegate, AnotherDelegate
Sie können wirklich nicht viel tun, auf dem iPhone ohne Delegierten alle über den Platz verwendet wird.
Die Delegierten werden überall und die ganze Zeit in iOS verwendet.
Es ist ganz normal, dass eine Klasse könnte ein Dutzend Teilnehmer verwenden.
Im Beispiel der „Flying“ oben, irgendwo im Code für „Fliege“ wäre es zu sagen hat ...
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
Im Falle von BigTop, würde es die Delegierten irgendwo für die ASIHttpRequests setzen müssen,
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:gid forKey:@"gid"];
[request setPostValue:nom forKey:@"nom"];
[request setDelegate:self];
(Do nicht in den alten Tagen vergessen mit Objective-C, x.delegate=self
war genau die gleiche wie [x setDelegate:self]
.)
Heute mit Swift geben Sie einfach
x.delegate = self
und das ist alles, was es ist.
Also, das ist, was du tust. Die Delegierten Senden von Nachrichten . Sie müssen sagen, Dabei gilt: Sie die Nachrichten gehen wollen. Sehr typisch, wollen Sie sie gehen „Sie“, so dass in diesem Fall, dass Sie einfach x.delegate=self
sagen.
Hope es hilft.
Andere Tipps
Delegate
verwendet wird, um Pass / kommunizieren, Daten / Nachricht b / w zwei Objekte von Klassen. Hier tableView
(Sender) sendet Daten / Nachricht an viewController
(Empfänger).
Betrachten wir beispielsweise die Umsetzung UITableView
in benutzerdefinierten viewController
Hier UITableViewDataSource
& UITableViewDelegate
sind tatsächlich Protokolle. Leider ist UIKit Framework
nicht Open Source. Aber ich werde dies gewährleisten, was nach dem Bezug viele Artikel intern passiert.
Protokoll ist wie Basketball-Trainer mit einigen Anforderungen in ihm. Er / Sie sagt Spieler wie Klasse, Struktur, Enumeration what to do?
durch diese Anforderungen mit. Aber Er / Sie doesn't knows
how to do?
by themself. Also, die Klasse oder Struktur, die dieses Protokoll entspricht sollte die Umsetzung dieser Anforderungen bieten und gleichzeitig zu erreichen, den Ball dunk.
protocol UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}
Ein Protokoll wird gesagt, Datasource-Protokoll sein, dann immer es enthält erforderliche Funktionen mit „Rückgabetyp“, wie unten dargestellt.
protocol UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
}
Implementieren von UITableView innerhalb benutzerdefinierten Viewcontroller
class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let tableView = UITableView()
override func viewDidLoad {
tableView.delegate = self
tableView.dataSource = self
}
Hier tableView
fungiert als Delegator (Sender) & viewController object i.e (self)
als Delegierter (Empfänger).
Um UITableView
in viewController
.It bekommen sollte sowohl die Protokolle zu entsprechen.
So hat viewController
Klassenobjekt alle diese erforderlichen Funktionen beider Protokolle implementiert. Jetzt kann self
verwendet werden, entweder als UITableViewDelegate
Typ oder UITableViewDataSource
Typ da Protokolle als Typ für ein Objekt der Klasse, welche Konform es verwendet werden können.
Nun, beide Eigenschaften von tableView
d.h delegate
& dataSource
sind self
zugewiesen, weil seine gleichen entsprechenden Protokolltypen haben.
Die nicht-optionalen Funktionen beider Protokolle werden in viewController
Klasse-Objekt implementiert, wie unten
Protokoll UITableViewDelegate
Funktionen
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// Do further processes like pushing or poping another viewController
}
Protokoll UITableViewDataSource
Funktionen
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
}
1) Wenn der Benutzer eine Zeile in einem Abschnitt wählt dann tableview
(Sender) d.h UItableView()
ruft die UITableViewDelegate
unter func indem Daten von Parametern gezeigt tableView
& indexPath
welche besteht in viewController
Objekt (Empfänger) durch seine delegate
Eigenschaft. Nun viewController
verwendet diese übergebenen Daten weitere Prozesse zu tun, wie Schub- oder poping zu neuen benutzerdefinierten Viewcontroller.
tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
2) Funktionen innerhalb UITableViewDatasource
Protokoll bietet kundenspezifische Daten zu tableview
(Sender). Die tableview
fragen das viewController
Objekt von Datasource-Funktionen Aufruf mit Daten zu den Parametern tableView
& indexPath
welche besteht in viewController
Objekt (Empfänger) durch seine datasource
Eigenschaft übergeben. Nun viewController
verwendet diese übergebenen Daten und kehrt benutzerdefinierte Daten zurück tableview
. Jetzt tableview
verwendet diese Daten „10“ Zellen in einem Abschnitt zu schaffen & Art „Zelle“ bei indexPath
tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"
tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"
Schließlich ganze UIKit Framework
Anwendungen delegieren & Datasource-Entwurfsmuster in allen ihren Klassen wie UIApplication
, UITableView
, UICollectionView
, UITextField
& so weiter, um Daten zu kommunizieren. Leider ist UIKit Framework
nicht Open Source.
Wenn in jedem Fall Bourne Antwort nicht hilft .. ein Delegierter ist im Grunde die Reaktion eines Ereignisses auf einem Objekt und sagen: „.delegate = self“ ist die Protokolle in Selbst angenommen worden ... für zB .. was passiert, wenn eine Zeile in Tableview ausgewählt wird, wird von der Tableview Delegatmethode „DidSelectRowAtIndexPath“, sagte ... und wenn ein Viewcontroller ein Tableview hat .. und „DidSelectRowAtIndexPath“ wird in diesem Viewcontroller definiert nur dann werden wir sagen ... tableview.delegate = self“... und „self.anything“ wird verwendet, dass „etwas“ zu sagen, ist eine Eigenschaft der Selbst .. für zB. NSString * alles; @property (nonatomic behalten) NSString * alles;
dann "self.anything"