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.
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.
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.
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.
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)
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.
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.
AddItemViewControllerDelegate
ProtocolOpen 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 :)
.
delegeren
EigendomHet 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.
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)
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.
AddItemViewControllerDelegate
ProtocolImplementatie 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)
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?
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!