Frage

Könnte jemand die Bedeutung von someViewController.delegate = self und self.delegate erklären? Wo sie uns helfen?

War es hilfreich?

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"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top