Swift From Scratch Delegation och Egenskaper

I den tidigare lektionen skapade du ett enkelt Swift-projekt i Xcode, en grundläggande att göra-ansökan. I denna del av Swift From Scratch kommer vi att lägga till möjligheten att skapa uppgiftsobjekt. På vägen lär du dig mer om handlingar, delegationer och egenskaper.

förutsättningar

Om du vill följa med mig, se till att du har Xcode 8.3.2 eller högre installerad på din maskin. Du kan ladda ner Xcode 8.3.2 från Apples App Store.

1. Lägga till objekt

I slutet av denna lektion kommer användaren att kunna lägga till nya saker att göra genom att trycka på en knapp i navigeringsfältet, presentera en vy med ett textfält och en knapp. Låt oss börja med att skapa visningskontrollen som hanterar att lägga till nya att göra saker, AddItemViewController klass.

Steg 1: Skapa AddItemViewController

Välja Ny> Fil ...  från Xcode s Fil menyn och välj Kakao Touch Class mall från listan över iOS> Källa mallar.

Namnge klassen AddItemViewController och se till att det ärar från UIViewController. Dubbelkontrollera det Språk är satt till Snabb och det Skapa också XIB-fil är avmarkerad.

Berätta Xcode där du vill spara filen för AddItemViewController klass och klicka Skapa.

Steg 2: Lägg till försäljningsställen och åtgärder

Innan vi skapar användargränssnittet för AddItemViewController klass måste vi skapa ett uttag för textfältet och två åtgärder, en för avbrytningsknapp i navigeringsfältet och en annan för skapningsknappen under textfältet.

Att lägga till ett uttag borde vara bekant nu. Skapa ett uttag i AddItemViewController klass och namnge det textfält enligt nedanstående.

klass AddItemViewController: UIViewController @IBOutlet var textField: UITextField! åsidosätta func viewDidLoad () super.viewDidLoad () åsidosätta func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Att skapa en åtgärd ligner mycket på att skapa en instansmetod. Faktum är att @IBAction Attributet är inget mer än en ledtråd för Interface Builder. Genom att prefixa en metod med @IBAction Attribut, vi ser till att gränssnittsbyggaren är medveten om metoden, vilket gör att vi kan ansluta den i storyboardet. Vi lämnar båda handlingarnas kroppar tom nu.

klass AddItemViewController: UIViewController @IBOutlet var textField: UITextField! åsidosätta func viewDidLoad () super.viewDidLoad () åsidosätta func didReceiveMemoryWarning () super.didReceiveMemoryWarning () @IBAction func cancel (_ avsändare: Alla)  @IBAction func create (_ avsändare: Any) 

Steg 3: Skapa användargränssnittet

Öppna Main.storyboardProject Navigator och dra a Visa kontrollenhet från Objektbibliotek till höger. Med den valda bildkontrollen, öppna Identitetsinspektör till höger och uppsättning Anpassad klass> Klass till AddItemViewController.

Om du vill lägga till en navigeringsfält i visningsalternativet väljer du Lägg till produkt Visa Controller och välj Bädda in> Navigation Controller från Redaktör meny. Detta kommer att göra Lägg till produkt Visa Controller rotationsbildkontrollen för en navigationsstyrenhet.

Nästa steg är att lägga till ett streckknappsobjekt i navigeringsfältet på Visa kontrollenhet-inte den Lägg till produkt Visa Controller-och sätt dess Identifierare till Lägg till Attribut Inspector.

När användaren knackar på Lägg till knapp, Lägg till produkt Visa Controller bör presenteras modellt. För att uppnå detta, tryck på Kontrollera tangent och dra från Lägg till knappen till Navigation Controller, väljer Presentera modellt från menyn som dyker upp. Detta kommer att skapa en segue från Lägg till produkt Visa Controller till det nya Navigation Controller.

Dra ett textfält och en knapp från Objektbibliotek och lägg till dem till Lägg till produkt Visa Controller scen. Välj Lägg till produkt Visa Controller och anslut den textfält utlopp med textfältet och skapa(_:) Åtgärd med knappen. De skapa(_:) åtgärder bör utlösas när Touch Up Inside händelsen avfyras. Ändra knappens titel till Skapa och lägg till nödvändiga layoutbegränsningar till textfältet och knappen.

För att slutföra användargränssnittet lägger du till ett streckknappsprodukt längst upp till vänster i navigeringsfältet på Lägg till produkt Visa Controller och sätt dess Identifierare till Annullera. Med Lägg till produkt Visa Controller välj, öppna Anslutningsinspektör och anslut den annullera(_:) åtgärd till Annullera knapp.

Bygg och kör programmet genom att trycka på Kommando-R för att verifiera att allt är anslutet korrekt.

2. Genomförande av ett delegerat protokoll

När användaren knackar på Skapa knappen för att lägga till en att göra-objekt, måste kontrollen för att lägga till objektet visa meddelandet för kontrollen av visningen. Delegationen är en perfekt lösning för detta scenario. Processen är ganska enkel.

Vi skapar ett delegatprotokoll ViewController klassen överensstämmer med. När AddItemViewController Exempel skapas när användaren tappar Lägg till button-den ViewController objektet är inställt som delegat av AddItemViewController instans som gör det möjligt för den senare att anmäla ViewController exempel när ett nytt att göra-objekt skapas. Låt oss bryta ner det för att bättre förstå denna process.

Steg 1: Förklara AddItemViewControllerDelegate Protokoll

Öppna AddItemViewController.swift och förklara AddItemViewControllerDelegate protokollet under importdeklarationen längst upp. Protokolldeklarationen liknar en klassdeklaration. De protokoll sökord följs av protokollets namn.

importera UIKit-protokollet AddItemViewControllerDelegate func controller (_ controller: AddItemViewController, didAddItem: String)

Konceptet ligner mycket på protokoll i Objective-C. Protokollets namn är AddItemViewControllerDelegate och det definierar en metod, styrenhet (_: didAddItem :).

Steg 2: Förklara delegera Fast egendom

Det objekt som behöver genomföra delegatprotokollet är delegat av AddItemViewController. Vi behöver först skapa en egendom för delegaten som visas i nedanstående formulär.

klass AddItemViewController: UIViewController @IBOutlet var textField: UITextField! var delegat: AddItemViewControllerDelegate? ...

De delegera egendom är av typ AddItemViewControllerDelegate?, en valfri typ, eftersom vi inte kan vara säkra på att delegera egendom är inte noll. Observera att protokollets namn inte är inslaget i vinklar som i mål-C.

Steg 3: Genomföra åtgärder

Delegemetoden, styrenhet (_: didAddItem :), kommer att åberopas i skapa(_:) åtgärd som visas nedan. För att hålla exemplet enkelt gör vi ingen validering på användarens inmatning.

Vi använder valfri kedja för att åberopa delegatmetoden på delegatobjektet, vilket innebär att delegatmetoden endast åberopas om delegera fastigheten är inställd. Värdet på textfältet lagras tillfälligt i en konstant, Artikel.

@IBAction func create (_ avsändare: Any) om låt item = textField.text delegera? .Controller (self, didAddItem: item)

Genomförandet av annullera(_:) Åtgärden är lätt. Allt vi gör är att avfärda AddItemViewController exempel.

@IBAction func cancel (_ avsändare: Any) dismiss (animated: true)

Steg 4: Ställ in delegat

Det finns en del av pusslet saknar dock. De delegera egenskapen hos AddItemViewController Instans är inte inställd för tillfället. Vi kan lösa detta genom att implementera framställa (för: avsändare :) metod i ViewController klass. Först måste vi dock gå tillbaka till storyboardet.

Öppna Main.storyboard och välj den segue som förbinder Lägg till knapp med Navigation Controller. Öppna Attribut Inspector och ställ in segue s Identifierare tillAddItemViewController.

Sedan implementerar du framställa (för: avsändare :) metod i ViewController klass som visas nedan. Notera åsidosätta sökord som prefixar metoden. Detta borde vara bekant nu.

åsidosätta func preparation (för segue: UIStoryboardSegue, avsändare: Any?) if segue.identifier == "AddItemViewController" leta navigationController = segue.destination as? UINavigationController låt addItemViewController = navigationController? .TopViewController som? AddItemViewController om låt viewController = addItemViewController viewController.delegate = self

Vi börjar med att kontrollera identifieringen av segeln, se till att vi förbereder oss för rätt segue. Vi frågar sedan seggen för sin destinationsvynskontroller. Du kan förvänta dig att detta är AddItemViewController till exempel, men kom ihåg att vi gjorde visningsstyraren root view controller av en navigationsstyrenhet. Det betyder att vi måste fråga navigationsstyrenheten, segueens destinationsvynskontroller, för sin toppvynskontroller.

De addItemViewController Konstant är av typ AddItemViewController? på grund av användningen av som? nyckelord. Med andra ord, genom att använda som? vi dämpade värdet av topViewController egendom till en valfri typ.

I om uttalande, vi packar bort valfri och ställer in delegera egendom till ViewController exempel.

Jag är säker på att du har märkt användningen av flera alternativ i implementeringen av framställa (för: avsändare :) metod. När du interagerar med API-objekt i Objective-C, är det alltid bättre att spela det säkert. Medan du skickar meddelanden till noll är helt bra i mål-C, det är inte i Swift. På grund av denna viktiga skillnad måste du alltid vara försiktig när du interagerar med Objective-C APIs i Swift. Ovanstående exempel illustrerar denna brunn.

Steg 5: Implementera AddItemViewControllerDelegate Protokoll

Genomförande av AddItemViewControllerDelegate protokollet liknar genomförandet av UITableViewDataSource protokoll. Vi börjar med att överensstämma med ViewController klass till protokollet som visas nedan.

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

Därefter implementerar vi metoderna för AddItemViewControllerDelegate protokoll, vilket kollar ner för att genomföra styrenhet (_: didAddItem :) metod. Vi lägger till det nya objektet i visningscontrollerens objekt egenskapen, ladda om tabellvyn och avvisa kontrollen för att lägga till objektet.

// MARK: Lägg till objekt Visa Controller Delegate Methods func controller (_ controller: AddItemViewController, didAddItem: String) // Uppdatera datakälla items.append (didAddItem) // Uppdatera tabellvisning tableView.reloadData () // Avvisa Lägg till produktvy Controller avvisa (animerad: true)

Steg 6: Bygg och kör

Bygg och kör applikationen för att testa om du kan lägga till nya objekt i listan. Vi validerar för närvarande inte användarens inmatning. Som en övning, visa en varningsvy till användaren om de knackar på Skapa knappen och textfältet är tomt. Att lägga till en tom göra är inte särskilt användbar. Höger?

Slutsats

I den här lektionen lärde du dig att förklara och implementera ett anpassat protokoll. Du lärde dig också att skapa handlingar och koppla upp dem i gränssnittsbyggaren. I nästa lektion kommer vi att slutföra vår giltiga ansökan genom att lägga till möjligheten att ta bort att göra saker, och vi kommer också att förbättra programmets användarupplevelse.

Under tiden, kolla in några av våra andra kurser och handledning om Swift-språk iOS-utveckling!