Wie macht man einen Delegierten, dh NSUserNotificationCenterDelegate
schnell?
delegates
swift
delegation
user3718173
quelle
quelle
Antworten:
Es ist nicht so verschieden von obj-c. Zunächst müssen Sie das Protokoll in Ihrer Klassendeklaration wie folgt angeben:
Die Implementierung sieht folgendermaßen aus:
Natürlich müssen Sie den Delegaten einstellen. Beispielsweise:
quelle
@interface MyCustomClass: UIViewController <ClassIWantToUseDelegate>
, sodass Sie den Viewcontroller initiieren / konfigurieren und Delegierungsmethoden für die Unteransichten aufrufen können. Etwas ähnliches wie diese ?Hier ist eine kleine Hilfe für Delegierte zwischen zwei Ansichtscontrollern:
Schritt 1: Erstellen Sie im UIViewController ein Protokoll, das Sie entfernen / die Daten senden.
Schritt 2: Deklarieren Sie den Delegaten in der sendenden Klasse (dh UIViewcontroller).
Schritt 3: Verwenden Sie den Delegaten in einer Klassenmethode, um die Daten an die Empfangsmethode zu senden. Hierbei handelt es sich um eine beliebige Methode, die das Protokoll übernimmt.
Schritt 4: Übernehmen Sie das Protokoll in die empfangende Klasse
Schritt 5: Implementieren Sie die Delegate-Methode
Schritt 6: Legen Sie den Delegaten in prepareForSegue fest:
Und das sollte funktionieren. Dies sind natürlich nur Codefragmente, sollten Ihnen aber die Idee geben. Für eine lange Erklärung dieses Codes können Sie hier zu meinem Blogeintrag gehen:
Segues und Delegierte
Wenn Sie daran interessiert sind, was mit einem Delegierten unter der Haube los ist, habe ich hier darüber geschrieben:
unter der Haube mit Delegierten
quelle
weak
wird nur für Klassen benötigt, nicht für Strukturen und Aufzählungen. Wenn der Delegat eine Struktur oder eine Aufzählung sein soll, müssen Sie sich keine Gedanken über Aufbewahrungszyklen machen. Der Delegat ist jedoch eine Klasse (dies gilt in vielen Fällen, da es sich häufig um einen ViewController handelt). Dann müssenweak
Sie Ihr Protokoll als Klasse deklarieren. Es gibt mehr Informationen hier stackoverflow.com/a/34566876/296446Die Delegierten haben mich immer verwirrt, bis mir klar wurde, dass ein Delegierter nur eine Klasse ist, die für eine andere Klasse arbeitet . Es ist, als hätte jemand anderes die Drecksarbeit für Sie erledigt, die Sie nicht selbst erledigen möchten.
Ich habe eine kleine Geschichte geschrieben, um dies zu veranschaulichen. Lesen Sie es auf einem Spielplatz, wenn Sie möchten.
Es war einmal...
Im Rückblick gibt es drei Schlüsselelemente für die Erstellung und Verwendung des Delegatenmusters.
Wahres Leben
Im Vergleich zu unserer obigen Bossy Big Brother-Geschichte werden Delegierte häufig für die folgenden praktischen Anwendungen verwendet:
Der große Teil ist, dass diese Klassen vorher nichts voneinander wissen müssen, außer dass die Delegatenklasse dem erforderlichen Protokoll entspricht.
Ich empfehle dringend, die folgenden zwei Artikel zu lesen. Sie haben mir geholfen, die Delegierten noch besser zu verstehen als die Dokumentation .
Noch eine Anmerkung
Delegaten, die auf andere Klassen verweisen, die sie nicht besitzen, sollten das
weak
Schlüsselwort verwenden, um starke Referenzzyklen zu vermeiden. Siehe diese Antwort für weitere Details.quelle
Ich habe einige Korrekturen für @MakeAppPie erhalten
Wenn Sie ein Delegatenprotokoll erstellen, sollte es zunächst dem Klassenprotokoll entsprechen. Wie im folgenden Beispiel.
Zweitens sollte Ihr Delegierter schwach sein, um einen Aufbewahrungszyklus zu vermeiden.
Zuletzt sind Sie sicher, da Ihr Protokoll ein optionaler Wert ist. Das bedeutet, dass die Nachricht "Null" nicht an diese Eigenschaft gesendet wird. Es ähnelt der bedingten Anweisung mit
respondToselector
in objC, aber hier haben Sie alles in einer Zeile:Oben haben Sie ein obj-C-Beispiel und unten haben Sie ein Swift-Beispiel dafür, wie es aussieht.
quelle
delegate?.myMethod
, stürzt dies nicht ab, denn wenn der Delegat istnil
, würde nichts passieren. Allerdings , wenn Sie Fehler gemacht und schriebdelegate!.myMethod
man könnte abstürzen , wenn ein Delegierter nicht gesetzt ist, so ist es im Grunde eine Möglichkeit für Sie , um sicher zu sein ...Hier ist ein Kern, den ich zusammengestellt habe. Ich habe mich das auch gefragt und dies hat mir geholfen, mein Verständnis zu verbessern. Öffne dies auf einem Xcode-Spielplatz, um zu sehen, was los ist.
quelle
UIViewController
Klasse dazu bringen, den von uns erstellten Delegierten zu entsprechen? Müssen sie in einer schnellen Datei deklariert werden? Jede Hilfe wird viel bedeuten.class ViewController : UIViewController NameOfDelegate
.a.swift
gemäß Ihrer obigen Antwort erstelle , wird sie nicht angezeigtb.swift
. Ich kann keine Klasse außerhalb meiner schnellen Datei erreichen. irgendwelche Schwierigkeiten?DELEGATE IN SWIFT 2
Ich erkläre anhand eines Beispiels für Delegate mit zwei viewControllern. In diesem Fall sendet SecondVC Object Daten an den ersten View Controller zurück.
Klasse mit Protokollerklärung
Im First ViewController-Protokoll wird hier Folgendes angepasst:
Definition der Protokollmethode in First View Controller (ViewController)
Während des Pushs der SecondVC vom First View Controller (ViewController)
quelle
Erste Klasse:
Zweite Klasse:
quelle
Type 'ViewController' does not conform to protocol 'NetworkServiceDelegate'
angezeigt. Es ist mein 6. Tag auf Swift :)Sehr einfach Schritt für Schritt (100% arbeiten und getestet)
Schritt 1: Erstellen Sie eine Methode auf dem First View Controller
Schritt 2: Legen Sie den Delegaten fest, während Sie auf den Controller für die zweite Ansicht drücken
Schritt 3: Delegate wie einstellen
Klasse ViewController: UIViewController, ProcessStatusDelegate {
Schritt 4: Protokoll erstellen
Schritt 5: Nehmen Sie eine Variable
Schritt 6: Während Sie zur vorherigen View Controller Call Delegate-Methode zurückkehren, benachrichtigen Sie zuerst den View Controller mit Daten
quelle
Einfaches Beispiel:
quelle
Delegaten sind ein Entwurfsmuster, mit dem ein Objekt Nachrichten an ein anderes Objekt senden kann, wenn ein bestimmtes Ereignis eintritt. Stellen Sie sich vor, ein Objekt A ruft ein Objekt B auf, um eine Aktion auszuführen. Sobald die Aktion abgeschlossen ist, sollte Objekt A wissen, dass B die Aufgabe abgeschlossen hat, und die erforderlichen Maßnahmen ergreifen. Dies kann mit Hilfe von Delegierten erreicht werden! Hier ist ein Tutorial, in dem Delegierte Schritt für Schritt in Swift 3 implementiert werden
Tutorial Link
quelle
Die oben genannten Lösungen schienen ein wenig gekoppelt zu sein und gleichzeitig zu vermeiden, dass dasselbe Protokoll in anderen Controllern wiederverwendet wird. Deshalb habe ich eine Lösung gefunden, die mit generischer Typlöschung stärker typisiert ist.
Ausgabe : hat neuen Wert newValue
quelle
In schnellem 4.0
Erstellen Sie einen Delegaten für eine Klasse, der Daten senden oder Funktionen für andere Klassen bereitstellen muss
Mögen
Danach in der Klasse, die diesem Delegierten bestätigen wird
quelle