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.
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.
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.
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.
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)
Ö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.
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.
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 :)
.
delegieren
EigentumDas 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.
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)
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.
AddItemViewControllerDelegate
ProtokollImplementierung 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)
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?
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!