Swift From Scratch Delegasjon og Egenskaper

I den forrige leksjonen opprettet du et enkelt Swift-prosjekt i Xcode, et grunnleggende oppgaveprogram. I denne delen av Swift From Scratch skal vi legge til muligheten til å lage oppgaver. Underveis lærer du om handlinger, delegering og egenskaper.

Forutsetninger

Hvis du vil følge med meg, så sørg for at du har Xcode 8.3.2 eller høyere installert på maskinen din. Du kan laste ned Xcode 8.3.2 fra Apples App Store.

1. Legge til elementer

Ved slutten av denne leksjonen vil brukeren kunne legge til nye gjøremål ved å trykke på en knapp i navigasjonsfeltet, presentere en visning med et tekstfelt og en knapp. La oss begynne med å opprette visningskontrolleren som vil håndtere å legge til nye ting å gjøre, den AddItemViewController klasse.

Trinn 1: Opprett AddItemViewController

Velge Ny> Fil ...  fra Xcode er Fil menyen og velg Cocoa Touch Class mal fra listen over iOS> Kilde maler.

Gi klassen navn AddItemViewController og sørg for at den arver fra UIViewController. Dobbeltklikk det Språk er satt til Fort og det Lag også XIB-fil er ukontrollert.

Fortell Xcode hvor du vil lagre filen for AddItemViewController klasse og klikk Skape.

Trinn 2: Legg til utsalgssteder og tiltak

Før vi oppretter brukergrensesnittet til AddItemViewController klasse, må vi opprette et uttak for tekstfeltet og to handlinger, en for avbryt-knapp i navigeringslinjen og en annen for opprett-knappen under tekstfeltet.

Å legge til et stikkontakt bør være kjent nå. Lag et uttak i AddItemViewController klasse og navn den tekstfelt som vist under.

klasse AddItemViewController: UIViewController @IBOutlet var textField: UITextField! overstyr func viewDidLoad () super.viewDidLoad () overstyre func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Å lage en handling ligner veldig på å opprette en instansmetode. Faktisk er det @IBAction Attributt er ikke noe mer enn et hint for Interface Builder. Ved å prefikse en metode med @IBAction Attributt, vi sørger for at Interface Builder er oppmerksom på metoden, som gjør at vi kan koble den til storyboard. Vi vil forlate kroppene til begge handlingene tom for nå.

klasse AddItemViewController: UIViewController @IBOutlet var textField: UITextField! overstyr func viewDidLoad () super.viewDidLoad () overstyr func didReceiveMemoryWarning () super.didReceiveMemoryWarning () @IBAction func avbryte (_ sender: Any)  @IBAction func create (_ sender: Any) 

Trinn 3: Opprett brukergrensesnittet

Åpen Main.storyboardProsjektnavigator og dra a Vis kontrolleren fra Objektbibliotek til høyre. Når visningskontrollen er valgt, åpner du Identitetsinspektør til høyre og sett Tilpasset klasse> Klasse til AddItemViewController.

Hvis du vil legge til en navigeringslinje i tilleggsvisningsvisningen, velger du Legg til produkt View Controller og velg Integrer inn> Navigasjons kontroller fra Redaktør Meny. Dette vil gjøre Legg til produkt View Controller rotasjonsvisningskontrollen til en navigasjonsregulator.

Det neste trinnet er å legge til et strekkknappelement i navigasjonslinjen til Vis kontrolleren-ikke Legg til produkt View Controller-og sett dens Identifier til Legg til Attributtsinspektør.

Når brukeren tapper på Legg til knappen, den Legg til produkt View Controller bør presenteres modelt. For å oppnå dette, trykk på Styre tast og dra fra Legg til knappen til Navigasjonskontroller, velge Present Modally fra menyen som dukker opp. Dette vil skape en segue fra Legg til produkt View Controller til den nye Navigasjonskontroller.

Dra et tekstfelt og en knapp fra Objektbibliotek og legg dem til Legg til produkt View Controller scene. Velg Legg til produkt View Controller og koble til tekstfelt uttak med tekstfelt og skape(_:) handling med knappen. De skape(_:) handling bør utløses når Berør på innsiden hendelsen er sparken. Endre tittel på knappen til Skape og legg til de nødvendige layoutbegrensningene til tekstfeltet og -knappen.

For å fullføre brukergrensesnittet, legg til et barknappelement øverst til venstre i navigasjonslinjen til Legg til produkt View Controller og sett dens Identifier til Avbryt. Med Legg til produkt View Controller valgt, åpne Tilkoblingsinspektør og koble til Avbryt(_:) handling til Avbryt knapp.

Bygg og kjør programmet ved å trykke Kommando-R for å bekrefte at alt er tilkoblet riktig.

2. Gjennomføring av en delegert protokoll

Når brukeren tapper på Skape knappen for å legge til en gjøremål, må visningselementkontrollen legge til visningskontrolleren. Delegasjon er en perfekt løsning for dette scenariet. Prosessen er ganske enkel.

Vi lager en delegatprotokoll ViewController klassen overholder. Når AddItemViewController forekomst er opprettet - når brukeren tapper Legg til button-den ViewController objektet er angitt som delegat av AddItemViewController eksempel, slik at den sistnevnte kan varsle ViewController eksempel når et nytt oppgaveelement opprettes. La oss slå det ned for å bedre forstå denne prosessen.

Trinn 1: Erklære AddItemViewControllerDelegate protokoll

Åpen AddItemViewController.swift og erklærer AddItemViewControllerDelegate protokoll under import uttalelsen øverst. Protokolldeklarasjonen ligner en klassedeklarasjon. De protokollen Søkeordet etterfølges av navnet på protokollen.

importere UIKit-protokollen AddItemViewControllerDelegate func controller (_ kontroller: AddItemViewController, didAddItem: String)

Konseptet ligner veldig protokoller i Objective-C. Navnet på protokollen er AddItemViewControllerDelegate og det definerer en metode, kontroller (_: didAddItem :).

Trinn 2: Erklære delegat Eiendom

Objektet som trenger å implementere delegatprotokollen er delegat av AddItemViewController. Vi må først opprette en eiendom for delegaten som vist i utdragsboken nedenfor.

klasse AddItemViewController: UIViewController @IBOutlet var textField: UITextField! var delegert: AddItemViewControllerDelegate? ...

De delegat Eiendommen er av typen AddItemViewControllerDelegate?, en valgfri type, siden vi ikke kan være sikre på at delegat Eiendommen er ikke nil. Merk at navnet på protokollen ikke er pakket inn i vinkelbeslag som i mål-C.

Trinn 3: Implementer tiltak

Delegemetoden, kontroller (_: didAddItem :), vil bli påkalt i skape(_:) handling som vist nedenfor. For å holde eksemplet enkelt, gjør vi ingen validering på brukerens innspill.

Vi bruker valgfri kjetting for å påkalle delegatemetoden på delegatobjektet, som betyr at delegatemetoden kun påberopes dersom delegat eiendommen er satt. Verdien av tekstfeltet lagres midlertidig i en konstant, punkt.

@IBAction func create (_ sender: Any) hvis la element = textField.text delegere? .Controller (selv, gjordeAddItem: element)

Gjennomføringen av Avbryt(_:) handlingen er lett. Alt vi gjør er å avvise AddItemViewController forekomst.

@IBAction func avbryte (_ sender: Enhver) avvis (animert: true)

Trinn 4: Still inn delegat

Det er et stykke av puslespillet mangler skjønt. De delegat eiendom av AddItemViewController forekomst er ikke satt for øyeblikket. Vi kan løse dette ved å implementere forberede (for avsender- :) metode i ViewController klasse. Først må vi imidlertid gå tilbake til storyboardet.

Åpen Main.storyboard og velg segue som forbinder Legg til knapp med Navigasjonskontroller. Åpne Attributtsinspektør og sett segue s Identifier tilAddItemViewController.

Deretter implementerer du forberede (for avsender- :) metode i ViewController klassen som vist nedenfor. Legg merke til overstyring søkeord prefiks metoden. Dette burde være kjent nå.

overstyre func forberedelse (for segue: UIStoryboardSegue, sender: Any?) if segue.identifier == "AddItemViewController" la navigationController = segue.destination as? UINavigationController la addItemViewController = navigationController? .TopViewController som? AddItemViewController hvis la viewController = addItemViewController viewController.delegate = self

Vi begynner med å sjekke identifikatoren for fortellingen, og sørger for at vi forbereder oss på riktig segue. Deretter spør vi segue for bestemmelsesvisningskontrollen. Du kan forvente at dette skal være AddItemViewController eksempel, men husk at vi gjorde visningskontrolleren rotasjonsvisningskontrollen til en navigasjonsregulator. Dette betyr at vi må spørre navigasjonskontrolleren, segueens bestemmelsesvisningskontroller, for toppvisningskontrollen.

De addItemViewController Konstant er av typen AddItemViewController? på grunn av bruken av som? søkeord. Med andre ord, ved å bruke som? vi nedslått verdien av topViewController eiendom til en valgfri type.

I hvis uttalelse, pakker vi ut de valgfrie og angir delegat eiendom til ViewController forekomst.

Jeg er sikker på at du har lagt merke til bruken av flere alternativ i implementeringen av forberede (for avsender- :) metode. Når du samhandler med Objective-C APIer, er det alltid bedre å spille det trygt. Mens du sender meldinger til nil er helt fint i Mål-C, det er ikke i Swift. På grunn av denne viktige forskjellen, må du alltid være forsiktig når du samhandler med Objective-C APIs i Swift. Eksemplet ovenfor illustrerer denne brønnen.

Trinn 5: Implementer AddItemViewControllerDelegate protokoll

Gjennomføring av AddItemViewControllerDelegate protokollen ligner på implementeringen av UITableViewDataSource protokoll. Vi begynner med å tilpasse ViewController klassen til protokollen som vist nedenfor.

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

Deretter implementerer vi metodene til AddItemViewControllerDelegate protokoll, som koker ned til å implementere kontroller (_: didAddItem :) metode. Vi legger til det nye elementet i visningsregulatorens elementer Egenskap, Oppdater tabellvisningen, og avvis Add-visnings-kontrolleren.

// MARK: Legg til element View Controller Delegate Methods func controller (_ kontroller: AddItemViewController, didAddItem: String) // Oppdater datakilde items.append (didAddItem) // Oppdater tabellvisning tableView.reloadData () // Avvis Legg til produktvisning Kontroller avviser (animert: sant)

Trinn 6: Bygg og kjøre

Bygg og kjør programmet for å teste om du kan legge til nye elementer på oppgavelisten. Vi validerer for øyeblikket ikke brukerens innspill. Som en øvelse, vis et varselvisning til brukeren hvis de klikker på Skape knappen og tekstfeltet er tomt. Å legge til en tom å gjøre er ikke veldig nyttig. Ikke sant?

Konklusjon

I denne leksjonen lærte du å deklarere og implementere en egendefinert protokoll. Du lærte også å lage handlinger og koble dem opp i Interface Builder. I den neste leksjonen skal vi fullføre vårt gjøremålsprogram ved å legge til muligheten til å slette gjøremål, og vi vil også forbedre programmets brukeropplevelse..

I mellomtiden kan du sjekke ut noen av våre andre kurs og opplæringsprogrammer om swift språk iOS-utvikling!