2016-07-11 18 views
0

Ich verstehe, wie Delegierung mit iOS-Objekten verwendet wird, die bereits vorhanden sind. Wenn ich beispielsweise eine Instanz von UITableView erstelle und mein View-Controller dem UITableView-Delegaten entspricht, kann ich die verschiedenen Methoden des UITableView-Delegaten implementieren. Meine neu erstellte Tabelle kann Benachrichtigungen empfangen, zum Beispiel wenn didSelectRowAtIndexPath aufgerufen wird.Wie funktioniert die iOS-Delegation?

Meine Frage ist, warum hat meine Tabelle diesen bestimmten Delegaten Rückruf erhalten? Ich verstehe, dass der Delegat nur eine Liste von Methoden ohne Implementierung ist. Es scheint mir, dass da noch viel mehr passieren muss. Was passiert wirklich "hinter den Kulissen"?

Bild, wenn ich alle Delegatmethoden der folgenden umbenennen: - mysteryMethod1 - mysteryMethod2 - mysteryMethod3 ... Etc Eines dieser Verfahren ist verantwortlich für die an einem bestimmten Index die Höhe einer Zeile zu setzen. Ein anderer dieser Methoden wird für die Bearbeitung einer bestimmten Zeile verantwortlich sein.

Alles, was ich über Delegierung gelesen habe, sagt, dass der Delegierende einen Vertrag mit dem Delegierten schließt. Der Delegierte verspricht, die Methoden zu implementieren. Wenn das der Fall ist, ist alles irgendwie richtig verkabelt und alles funktioniert wunderbar. Was ist die Magie, die ich nicht sehe?

+1

Es gibt Tausende von Tutorials, die erklärt, wie Delegate funktioniert, eine der zufälligen Erklärungen ist z. [hier] (https://www.natashatherobot.com/explaining-ios-delegates-a-story-about-your-morning-coffee/). – holex

Antwort

0

Ich denke, dass, um zu wissen, wie Delegierte tatsächlich arbeiten, Sie zuerst Ihre eigenen benutzerdefinierten Delegaten erstellen sollten, so dass Sie sehen, dass es keine Magie unter der Haube ist, können Sie wahrscheinlich nicht die Implementierung des tatsächlichen Apple sehen bauen Sie Delegiertenmethoden ein, aber ich versichere Ihnen, dass dort viel Logik in diesen implementiert wird, aber es ist nur aus Gründen der Privatsphäre nicht verfügbar, nehme ich an. Wenn Sie Ihre benutzerdefinierten Delegaten lassen Sie uns zum Beispiel sagen schaffen ...

Sie haben Klasse A und in dieser Klasse starten Sie

protocol ClassADelegate: class { 
func changeBackgroundColor(_ color: UIColor?) 
} 

In dieser Klasse ein Protokoll durch die Schaffung haben Sie einen Delegaten Eigenschaft wie folgt .

weak var delegate: ClassADelegate? 

Lassen Sie uns sagen, dass diese Klasse eine Viewcontroller ist und Sie haben eine IBAction auf sie wie ein UIButton, und Ihr Ziel ist es, dass, wenn Sie diese Taste eine andere Viewcontroller tippen in Ihrer App blauen seine Hintergrundfarbe ändern. Innerhalb dieser Aktion in der Klasse A Sie dies tun ...

func someAction() { 
delegate?.changeBackgroundColor(.blue) 
} 

, sagen lassen, dass die „Magie“ hier in der Klasse A geschieht, durch die Art und Weise, wenn Sie in den Delegierten denken mit UITableView denkt, dass UITableView Klasse A.

ok also jetzt hast du Klasse B, wo willst du die farbe richtig? Nun Klasse B muss das Protokoll so entsprechen, wie Sie gerade auch dem Protokoll entsprechen UITableViewDelegate usw.

class ClassB: UIViewController, ClassADelegate { 
} 

für eine Sekunde des Wortes Delegierten denken jetzt und denken, was das bedeutet, Sie sind nur Verantwortung an jemand anderen delegieren, oder? und ja, in diesem Fall wird ClassB delegiert, denn dafür brauchen wir eine Instanz der Klasse A in Klasse B, nur um Zugriff auf die Delegate-Eigenschaft zu haben.

der letzte Schritt ist nur, um die Methode des Protokolls so zu nennen ..

func changeBackgroundColor(_ color: UIColor?) { 
view.backgroundColor = color 
} 

zu schließen, wenn yo diese Methode in Ihrer Klasse sehen, aber Sie Zugriff nicht auf die Umsetzung des Protokolls haben, werden Sie sich fragen: „Woher kommt diese magische Farbe kommen ??“ Aber wie du gesehen hast, kommt es nur von einer anderen Klasse, wo ein Protokoll gehört, hoffe das hilft.