Schnell von Grund auf Delegierung und Eigenschaften

In der vorherigen Lektion haben Sie ein einfaches Swift-Projekt in Xcode erstellt, eine grundlegende To-Do-Anwendung. In diesem Teil von Swift From Scratch wird die Möglichkeit hinzugefügt, Aufgaben zu erstellen. Auf dem Weg erfahren Sie mehr über Aktionen, Delegierung und Eigenschaften.

Voraussetzungen

Wenn Sie mit mir folgen möchten, stellen Sie sicher, dass Xcode 8.3.2 oder höher auf Ihrem Computer installiert ist. Sie können Xcode 8.3.2 im App Store von Apple herunterladen.

1. Elemente hinzufügen

Am Ende dieser Lektion können Sie neue Aufgaben hinzufügen, indem Sie auf eine Schaltfläche in der Navigationsleiste tippen und eine Ansicht mit einem Textfeld und einer Schaltfläche anzeigen. Beginnen wir mit der Erstellung des View-Controllers, der das Hinzufügen neuer Aufgaben, die AddItemViewController Klasse.

Schritt 1: Erstellen AddItemViewController

Wählen Neu> Datei…  von Xcode's Datei Menü und wählen Sie die Kakao-Touch-Klasse Vorlage aus der Liste von iOS> Quelle Vorlagen.

Benennen Sie die Klasse AddItemViewController und stellen Sie sicher, dass es von erbt UIViewController. Überprüfen Sie das noch einmal Sprache ist eingestellt auf Schnell und das Erstellen Sie auch eine XIB-Datei ist nicht geprüft.

Teilen Sie Xcode mit, wo Sie die Datei für den Computer speichern möchten AddItemViewController klasse und klick Erstellen.

Schritt 2: Fügen Sie Outlets und Aktionen hinzu

Bevor wir die Benutzeroberfläche des erstellen AddItemViewController In dieser Klasse müssen wir einen Auslass für das Textfeld und zwei Aktionen erstellen, eine für die Schaltfläche "Abbrechen" in der Navigationsleiste und eine weitere für die Schaltfläche "Erstellen" unter dem Textfeld.

Das Hinzufügen einer Steckdose sollte inzwischen vertraut sein. Erstellen Sie eine Steckdose im AddItemViewController Klasse und nennen Sie es Textfeld Wie nachfolgend dargestellt.

Klasse AddItemViewController: UIViewController @IBOutlet var textField: UITextField! Überschreiben von func viewDidLoad () super.viewDidLoad () Überschreiben von func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Das Erstellen einer Aktion ähnelt sehr dem Erstellen einer Instanzmethode. In der Tat die @IBAction Attribut ist nichts weiter als ein Hinweis für den Interface Builder. Durch das Präfix einer Methode mit dem @IBAction Attribut stellen wir sicher, dass Interface Builder die Methode kennt, die es uns ermöglicht, sie im Storyboard zu verknüpfen. Wir werden die Körper beider Aktionen vorerst leer lassen.

Klasse AddItemViewController: UIViewController @IBOutlet var textField: UITextField! func viewDidLoad () super.viewDidLoad () überschreiben func didReceiveMemoryWarning () super.didReceiveMemoryWarning () @IBAction func abbrechen (_ sender: Any)  @IBAction func create (_ sender: Any) 

Schritt 3: Erstellen Sie die Benutzeroberfläche

Öffnen Hauptplatine in dem Projektnavigator und ziehen Sie ein Controller anzeigen von dem Objektbibliothek zur Rechten. Öffnen Sie bei ausgewähltem View-Controller die Identitätsinspektor rechts und eingestellt Benutzerdefinierte Klasse> Klasse zu AddItemViewController.

Wählen Sie zum Hinzufügen einer Navigationsleiste zur Elementansicht Elementansicht-Controller hinzufügen und wähle Einbetten in> Navigationscontroller von dem Editor Speisekarte. Das wird das machen Elementansicht-Controller hinzufügen der Root-View-Controller eines Navigationscontrollers.

Im nächsten Schritt fügen Sie der Navigationsleiste des Navigationselements ein Schaltflächenelement hinzu Controller anzeigen-nicht der Elementansicht-Controller hinzufügen-und sein setzen Kennung zu Hinzufügen in dem Attribute-Inspektor.

Wenn der Benutzer auf die Hinzufügen Taste, die Elementansicht-Controller hinzufügen sollte modal präsentiert werden. Drücken Sie dazu die Taste Steuerung Taste und ziehen Sie aus dem Hinzufügen Taste zum Navigationssteuerung, auswählen Modal präsentieren aus dem Menü, das erscheint. Dadurch wird ein Übergang von der erstellt Elementansicht-Controller hinzufügen zu den neuen Navigationssteuerung.

Ziehen Sie ein Textfeld und eine Schaltfläche aus der Objektbibliothek und füge sie dem hinzu Elementansicht-Controller hinzufügen Szene. Wähle aus Elementansicht-Controller hinzufügen und verbinden Sie die Textfeld Steckdose mit dem Textfeld und der erstellen(_:) Aktion mit der Taste. Das erstellen(_:) Aktion sollte ausgelöst werden, wenn die Touch Up Inside Ereignis wird ausgelöst. Ändern Sie den Titel der Schaltfläche in Erstellen und fügen Sie dem Textfeld und der Schaltfläche die erforderlichen Layoutbeschränkungen hinzu.

Um die Benutzeroberfläche zu beenden, fügen Sie links oben in der Navigationsleiste des Fensters ein Balkenschaltflächenelement hinzu Elementansicht-Controller hinzufügen und sein setzen Kennung zu Stornieren. Mit dem Elementansicht-Controller hinzufügen ausgewählt, öffnen Sie die Verbindungsinspektor und verbinden Sie die stornieren(_:) Aktion zum Stornieren Taste.

Erstellen und starten Sie die Anwendung, indem Sie drücken Befehl-R um zu überprüfen, ob alles korrekt angeschlossen ist.

2. Implementierung eines Delegiertenprotokolls

Wenn der Benutzer auf die Erstellen Wenn Sie einen To-Do-Eintrag hinzufügen möchten, muss der View-View-Controller den View-Controller benachrichtigen. Die Delegierung ist eine perfekte Lösung für dieses Szenario. Der Prozess ist ziemlich einfach.

Wir erstellen ein Delegatenprotokoll ViewController Klasse entspricht. Wenn der AddItemViewController Instanz wird erstellt, wenn der Benutzer auf die Schaltfläche tippt Hinzufügen Taste-die ViewController Das Objekt wird als Delegierter des festgelegt AddItemViewController Dies ermöglicht es letzteren, das zu benachrichtigen ViewController Instanz, wenn ein neues Aufgabenelement erstellt wird. Um es besser zu verstehen, wollen wir es aufschlüsseln.

Schritt 1: Deklarieren Sie das AddItemViewControllerDelegate Protokoll

Öffnen AddItemViewController.swift und erkläre das AddItemViewControllerDelegate Protokoll unterhalb der Importanweisung oben. Die Protokolldeklaration ähnelt einer Klassendeklaration. Das Protokoll Auf das Schlüsselwort folgt der Name des Protokolls.

UIKit-Protokoll importieren AddItemViewControllerDelegate func controller (_ controller: AddItemViewController, didAddItem: String)

Das Konzept ist den Protokollen in Objective-C sehr ähnlich. Der Name des Protokolls lautet AddItemViewControllerDelegate und es definiert eine Methode, Controller (_: didAddItem :).

Schritt 2: Deklarieren Sie das delegieren Eigentum

Das Objekt, das das Delegatenprotokoll implementieren muss, ist der Delegat von AddItemViewController. Wir müssen zuerst eine Eigenschaft für den Delegierten erstellen, wie im folgenden Snippet gezeigt.

Klasse AddItemViewController: UIViewController @IBOutlet var textField: UITextField! var delegate: AddItemViewControllerDelegate?…

Das delegieren Eigenschaft ist vom Typ AddItemViewControllerDelegate?, ein optionaler Typ, da wir nicht sicher sein können, dass das delegieren Eigentum ist nicht Null. Beachten Sie, dass der Name des Protokolls nicht wie in Objective-C in spitze Klammern eingeschlossen ist.

Schritt 3: Aktionen implementieren

Die Delegatmethode, Controller (_: didAddItem :), wird im aufgerufen erstellen(_:) Aktion wie unten gezeigt. Um das Beispiel einfach zu halten, führen wir keine Überprüfung der Eingaben des Benutzers durch.

Wir verwenden die optionale Verkettung, um die Delegat-Methode für das Delegat-Objekt aufzurufen, dh die Delegat-Methode wird nur aufgerufen, wenn das delegieren Eigenschaft ist gesetzt. Der Wert des Textfelds wird vorübergehend in einer Konstanten gespeichert, Artikel.

@IBAction func create (_ sender: Any) wenn let item = textField.text delegate? .Controller (self, didAddItem: item)

Die Umsetzung der stornieren(_:) Aktion ist einfach. Alles, was wir tun, ist die Entlassung AddItemViewController Beispiel.

@IBAction func cancel (_ sender: Any) verwerfen (animiert: true)

Schritt 4: Legen Sie den Delegierten fest

Es fehlt jedoch ein Teil des Puzzles. Das delegieren Eigentum der AddItemViewController Instanz wird momentan nicht gesetzt. Wir können das beheben, indem wir das implementieren vorbereiten (für: Absender :) Methode in der ViewController Klasse. Zunächst müssen wir jedoch das Storyboard erneut betrachten.

Öffnen Hauptplatine und wählen Sie das Segment aus, das die Hinzufügen Taste mit der Navigationssteuerung. Öffne das Attribute-Inspektor und setze die Auswahl Kennung zuAddItemViewController.

Als nächstes implementieren Sie die vorbereiten (für: Absender :) Methode in der ViewController Klasse wie unten gezeigt. Beachten Sie das überschreiben Schlüsselwort vor der Methode. Das sollte inzwischen bekannt sein.

func vorbereiten (für Segue: UIStoryboardSegue, Sender: Any?) überschreiben if segue.identifier == "AddItemViewController" let navigationController = segue.destination as? UINavigationController lasse addItemViewController = navigationController? .TopViewController als? AddItemViewController, wenn viewController = addItemViewController viewController.delegate = self ist.

Wir prüfen zunächst die Kennung des Segues und stellen sicher, dass wir uns auf den korrekten Segue vorbereiten. Wir fragen dann den Segue nach dem Controller für die Zielansicht. Sie können erwarten, dass dies das ist AddItemViewController Beispiel, denken Sie jedoch daran, dass wir den View-Controller zum Root-View-Controller eines Navigationscontrollers gemacht haben. Dies bedeutet, dass wir den Navigationscontroller, den Zielansicht-Controller des Segues, nach dem Controller für die Draufsicht fragen müssen.

Das addItemViewController Konstante ist vom Typ AddItemViewController? wegen der Verwendung der wie? Stichwort. Mit anderen Worten, mit wie? wir haben den Wert der herabgesetzt topViewController Eigenschaft auf einen optionalen Typ.

In dem ob Anweisung auspacken wir das optionale und setzen das delegieren Eigentum an der ViewController Beispiel.

Ich bin mir sicher, dass Sie bei der Implementierung von die Verwendung mehrerer Optionals bemerkt haben vorbereiten (für: Absender :) Methode. Bei der Interaktion mit Objective-C-APIs ist es immer besser, auf Nummer sicher zu gehen. Beim Senden von Nachrichten an Null ist in Objective-C vollkommen in Ordnung, nicht in Swift. Aufgrund dieses Hauptunterschieds müssen Sie bei der Interaktion mit Objective-C-APIs in Swift immer vorsichtig sein. Das obige Beispiel veranschaulicht dies gut.

Schritt 5: Implementieren Sie die AddItemViewControllerDelegate Protokoll

Implementierung der AddItemViewControllerDelegate Protokoll ähnelt der Implementierung des UITableViewDataSource Protokoll. Wir fangen mit der Anpassung an ViewController klassen Sie das Protokoll wie unten gezeigt ein.

Klasse ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AddItemViewControllerDelegate …

Als nächstes implementieren wir die Methoden des AddItemViewControllerDelegate Protokoll, das auf die Implementierung der Controller (_: didAddItem :) Methode. Wir fügen das neue Element den View-Controllern hinzu Artikel Laden Sie die Tabellenansicht neu und schließen Sie den Controller für das Hinzufügen von Elementansichten.

// MARK: Elementansicht hinzufügen Controller-Delegate-Methoden func controller (_ controller: AddItemViewController, didAddItem: String) // Datenquelle aktualisieren items.append (didAddItem) // Tabellenansicht neu laden tableView.reloadData () // Elementansicht schließen Controller entlassen (animiert: true)

Schritt 6: Erstellen und ausführen

Erstellen Sie die Anwendung, und führen Sie sie aus, um zu testen, ob Sie der Aufgabenliste neue Elemente hinzufügen können. Derzeit überprüfen wir die Eingaben des Benutzers nicht. Zeigen Sie dem Benutzer als Übung eine Warnmeldung an, wenn Sie auf tippen Erstellen und das Textfeld ist leer. Das Hinzufügen einer leeren Aufgabe ist nicht sehr nützlich. Recht?

Fazit

In dieser Lektion haben Sie gelernt, ein benutzerdefiniertes Protokoll zu deklarieren und zu implementieren. Sie haben auch gelernt, wie Sie Aktionen erstellen und in Interface Builder einbinden. In der nächsten Lektion werden wir unsere To-Do-Anwendung abschließen, indem Sie die Möglichkeit zum Löschen von To-Do-Elementen hinzufügen. Außerdem verbessern wir die Benutzererfahrung der Anwendung.

In der Zwischenzeit können Sie einige unserer anderen Kurse und Tutorials zur Entwicklung von iOS in Swift Language ausprobieren!