Swift from Scratch Delegatie en eigenschappen

In de vorige les hebt u een eenvoudig Swift-project gemaakt in Xcode, een basistoepassing. In dit deel van Swift From Scratch gaan we de mogelijkheid toevoegen om actie-items te maken. Onderweg leer je over acties, delegatie en eigenschappen.

voorwaarden

Als je me wilt volgen, zorg er dan voor dat Xcode 8.3.2 of hoger op je computer is geïnstalleerd. Je kunt Xcode 8.3.2 downloaden van de App Store van Apple.

1. Items toevoegen

Aan het einde van deze les kan de gebruiker nieuwe actiepunten toevoegen door op een knop in de navigatiebalk te tikken, een weergave met een tekstveld en een knop voor te stellen. Laten we beginnen met het maken van de view-controller die nieuwe actiepunten toevoegt, de AddItemViewController klasse.

Stap 1: Maken AddItemViewController

Kiezen Nieuw> Bestand ...  van Xcode's het dossier menu en selecteer de Cocoa Touch Class sjabloon uit de lijst van iOS> Bron templates.

Geef de klas een naam AddItemViewController en zorg ervoor dat het erft van UIViewController. Controleer dat eens Taal ingesteld op Snel en dat Maak ook een XIB-bestand is uitgeschakeld.

Vertel Xcode waar u het bestand wilt opslaan voor de AddItemViewController klasse en klik creëren.

Stap 2: Voeg outlets en acties toe

Voordat we de gebruikersinterface van de AddItemViewController klasse, moeten we een stopcontact voor het tekstveld en twee acties maken, een voor een annuleerknop in de navigatiebalk en een andere voor de knop maken onder het tekstveld.

Het toevoegen van een stopcontact hoort nu bekend te zijn. Maak een outlet in de AddItemViewController klasse en noem het textField zoals hieronder getoond.

class AddItemViewController: UIViewController @IBOutlet var textField: UITextField! override func viewDidLoad () super.viewDidLoad () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Het maken van een actie lijkt veel op het maken van een instantiemethode. In feite is de @IBAction attribuut is niets meer dan een hint voor Interface Builder. Door een methode vooraf te zetten met de @IBAction attribuut, we zorgen ervoor dat Interface Builder op de hoogte is van de methode, waardoor we deze in het storyboard kunnen verbinden. We zullen de lichamen van beide acties voorlopig leeg laten.

class AddItemViewController: UIViewController @IBOutlet var textField: UITextField! override func viewDidLoad () super.viewDidLoad () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning () @IBAction func cancel (_ sender: Any)  @IBAction func create (_ sender: Any) 

Stap 3: Maak de gebruikersinterface

Open Main.storyboard in de Project Navigator en sleep een Bekijk Controller van de Objectbibliotheek aan de rechterkant. Met de view controller geselecteerd, opent u de Identiteitsinspecteur aan de rechterkant en stel in Aangepaste klasse> Klasse naar AddItemViewController.

Als u een navigatiebalk aan de weergave Item toevoegen wilt toevoegen, selecteert u de Add Item View Controller toevoegen en kies Insluiten> Navigatiecontroller van de Editor menu. Dit zal het maken Add Item View Controller toevoegen de root view-controller van een navigatiecontroller.

De volgende stap is om een ​​item in de balkknop toe te voegen aan de navigatiebalk van de Bekijk Controller-niet de Add Item View Controller toevoegen-en stel zijn Identifier naar Toevoegen in de Kenmerken Inspector.

Wanneer de gebruiker op de Toevoegen knop, de Add Item View Controller toevoegen moet modaal worden gepresenteerd. Om dit te bereiken, drukt u op Controle toets en sleep vanuit de Toevoegen knop naar de Navigatiecontroller, selecteren Modieus presenteren uit het menu dat verschijnt. Hiermee maakt u een segue van de Add Item View Controller toevoegen naar het nieuwe Navigatiecontroller.

Sleep een tekstveld en een knop van de Objectbibliotheek en voeg ze toe aan de Add Item View Controller toevoegen tafereel. Selecteer de Add Item View Controller toevoegen en verbind de textField outlet met het tekstveld en de te maken (_ :) actie met de knop. De te maken (_ :) actie moet worden geactiveerd wanneer de Touch Up Inside evenement is ontslagen. Verander de titel van de knop in creëren en voeg de nodige lay-outbeperkingen toe aan het tekstveld en de knop.

Om de gebruikersinterface te voltooien, voegt u een balkknopitem toe linksboven in de navigatiebalk van de Add Item View Controller toevoegen en stel zijn Identifier naar annuleren. Met de Add Item View Controller toevoegen geselecteerd, open de Verbindingen Inspecteur en verbind de annuleren(_:) actie voor de annuleren knop.

Bouw en voer de applicatie uit door op te drukken Command-R om te controleren of alles correct is aangesloten.

2. Implementatie van een delegatieprotocol

Wanneer de gebruiker op de creëren om een ​​actiepunt toe te voegen, moet de controller voor het toevoegen van het weergave-item de view controller op de hoogte stellen. Delegatie is een perfecte oplossing voor dit scenario. Het proces is vrij eenvoudig.

We maken een delegatieprotocol voor het ViewController klas voldoet aan. Wanneer de AddItemViewController exemplaar wordt gemaakt - wanneer de gebruiker op de Toevoegen button-de ViewController object is ingesteld als de gedelegeerde van de AddItemViewController bijvoorbeeld, waardoor laatstgenoemde het ViewController bijvoorbeeld wanneer een nieuw actiepunt wordt gemaakt. Laten we het afbreken om dit proces beter te begrijpen.

Stap 1: Verklaar het AddItemViewControllerDelegate Protocol

Open AddItemViewController.swift en verklaar de AddItemViewControllerDelegate protocol onder de import-opdracht bovenaan. De protocolverklaring lijkt op een klasseverklaring. De protocol sleutelwoord wordt gevolgd door de naam van het protocol.

import UIKit-protocol AddItemViewControllerDelegate func controller (_ controller: AddItemViewController, didAddItem: String)

Het concept lijkt sterk op protocollen in Objective-C. De naam van het protocol is AddItemViewControllerDelegate en het definieert een methode, controller (_: didAddItem :).

Stap 2: Verklaar het delegeren Eigendom

Het object dat het gedelegeerde protocol moet implementeren, is de afgevaardigde van AddItemViewController. We moeten eerst een eigenschap voor de gedelegeerde maken, zoals weergegeven in het onderstaande fragment.

class AddItemViewController: UIViewController @IBOutlet var textField: UITextField! var delegate: AddItemViewControllerDelegate? ...

De delegeren eigendom is van het type AddItemViewControllerDelegate?, een optioneel type, omdat we er niet zeker van kunnen zijn dat het delegeren eigendom is dat niet nul. Merk op dat de naam van het protocol niet in punthaken is gewikkeld zoals in Objective-C.

Stap 3: voer acties uit

De gedelegeerde methode, controller (_: didAddItem :), zal worden aangeroepen in de te maken (_ :) actie zoals hieronder getoond. Om het voorbeeld eenvoudig te houden, voeren we geen enkele validatie uit op basis van de invoer van de gebruiker.

We gebruiken optionele keten om de gedelegeerde methode op het gedelegeerde object aan te roepen, wat betekent dat de gedelegeerde methode alleen wordt aangeroepen als de gedelegeerde methode delegeren eigendom is ingesteld. De waarde van het tekstveld wordt tijdelijk opgeslagen in een constante, item.

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

De implementatie van de annuleren(_:) actie is eenvoudig. Alles wat we doen is het afwijzen AddItemViewController aanleg.

@IBAction func cancel (_ sender: Any) dismiss (geanimeerd: true)

Stap 4: Stel de gedelegeerde in

Er ontbreekt echter een stukje van de puzzel. De delegeren eigendom van de AddItemViewController instantie wordt momenteel niet ingesteld. We kunnen dit oplossen door de bereiden (voor: afzender :) methode in de ViewController klasse. Eerst moeten we echter het storyboard opnieuw bezoeken.

Open Main.storyboard en selecteer de segue die de verbinding maakt Toevoegen knop met de Navigatiecontroller. Open de Kenmerken Inspector en stel de segue's in Identifier naarAddItemViewController.

Implementeer vervolgens de bereiden (voor: afzender :) methode in de ViewController klasse zoals hieronder getoond. Merk op override trefwoord voorvoegsel van de methode. Dit zou nu bekend moeten zijn.

override func prepare (voor segue: UIStoryboardSegue, sender: Any?) if segue.identifier == "AddItemViewController" let navigationController = segue.destination as? UINavigationController laat addItemViewController = navigationController? .TopViewController als? AddItemViewController if let viewController = addItemViewController viewController.delegate = self

We beginnen met het controleren van de identifier van de segue, en zorgen ervoor dat we ons voorbereiden op de juiste segue. Vervolgens vragen we de segue naar de controller voor doelweergave. Je mag verwachten dat dit de AddItemViewController Bijvoorbeeld, maar onthoud dat we de view controller de root view-controller van een navigatie-controller hebben gemaakt. Dit betekent dat we de navigatiecontroller, de controller voor doelaanzicht van de segue, moeten vragen voor zijn bovenaanzicht-controller.

De addItemViewController constante is van het type AddItemViewController? vanwege het gebruik van de zoals? trefwoord. Met andere woorden, door te gebruiken zoals? we tasten de waarde van de topViewController eigenschap naar een optioneel type.

In de als verklaring, we pakken het optionele uit en stellen de delegeren eigendom van de ViewController aanleg.

Ik ben er zeker van dat je het gebruik van verschillende opties in de implementatie van de bereiden (voor: afzender :) methode. Wanneer u communiceert met Objective-C API's, is het altijd beter om het veilig te spelen. Tijdens het verzenden van berichten naar nul is prima in Objective-C, het is niet in Swift. Vanwege dit belangrijke verschil, moet je altijd voorzichtig zijn wanneer je in API met Objective-C API's werkt. Het bovenstaande voorbeeld illustreert dit goed.

Stap 5: Implementeer de AddItemViewControllerDelegate Protocol

Implementatie van de AddItemViewControllerDelegate protocol lijkt op de implementatie van de UITableViewDataSource protocol. We beginnen met het voldoen aan de ViewController klasse aan het protocol zoals hieronder getoond.

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, AddItemViewControllerDelegate ...

Vervolgens implementeren we de methoden van de AddItemViewControllerDelegate protocol, wat neerkomt op de implementatie van de controller (_: didAddItem :) methode. We voegen het nieuwe item toe aan de view-controller's items eigenschap, laad de tabelweergave opnieuw en sluit de regelitem voor het toevoegen van items.

// MARK: Add Item View Controller Delegate Methods func controller (_ controller: AddItemViewController, didAddItem: String) // Update Data Source items.append (didAddItem) // Reload Table View tableView.reloadData () // Weergave Item toevoegen sluiten Controller negeren (geanimeerd: waar)

Stap 6: Build and Run

Bouw de toepassing en voer deze uit om te testen of u nieuwe items aan de takenlijst kunt toevoegen. We valideren de invoer van de gebruiker momenteel niet. Geef als oefening een waarschuwingsweergave voor de gebruiker weer als deze op de creëren knop en het tekstveld is leeg. Het toevoegen van een lege taak is niet erg handig. Rechts?

Conclusie

In deze les hebt u geleerd hoe u een aangepast protocol declareert en implementeert. Je hebt ook geleerd hoe je acties kunt maken en deze kunt aansluiten in Interface Builder. In de volgende les gaan we onze taak voltooien door de mogelijkheid toe te voegen taken te verwijderen en we verbeteren ook de gebruikerservaring van de toepassing..

Bekijk in de tussentijd enkele van onze andere cursussen en zelfstudies over de ontwikkeling van de Swift-taal voor iOS!