Swift From Scratch Delegare și proprietăți

În lecția anterioară, ați creat un proiect simplu Swift în Xcode, o aplicație de bază de rezolvat. În această tranșă de Swift From Scratch, vom adăuga capacitatea de a crea elemente de rezolvat. Pe parcurs, aflați despre acțiuni, delegații și proprietăți.

Cerințe preliminare

Dacă doriți să urmați alături de mine, asigurați-vă că aveți instalat Xcode 8.3.2 sau mai nou pe aparat. Puteți descărca Xcode 8.3.2 de la Apple's App Store.

1. Adăugarea elementelor

La sfârșitul acestei lecții, utilizatorul va putea adăuga elemente noi de rezolvat atingând un buton din bara de navigare, prezentând o vizualizare cu un câmp de text și un buton. Să începem prin crearea controlerului de vizualizare care se va ocupa cu adăugarea de elemente noi de rezolvat, AddItemViewController clasă.

Pasul 1: Creați AddItemViewController

Alege Nou> Fișier ...  din Xcode Fişier meniu și selectați Cocoa Touch Class șablon din lista de iOS> Sursă template-uri.

Denumiți clasa AddItemViewController și asigurați-vă că acesta moștenește UIViewController. Verificați dublu că Limba este setat sa Rapid și asta Creați de asemenea fișierul XIB este necontrolat.

Spuneți Xcode unde doriți să salvați fișierul pentru AddItemViewController clasa și faceți clic pe Crea.

Pasul 2: Adăugați puncte de vânzare și acțiuni

Înainte de a crea interfața de utilizator a AddItemViewController , trebuie să creați o priză pentru câmpul de text și două acțiuni, una pentru un buton de anulare în bara de navigare și altul pentru butonul de creare sub câmpul de text.

Adăugarea unei prize trebuie să fie familiară până acum. Creați o priză în AddItemViewController clasați și denumiți-o textfield așa cum se arată mai jos.

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

Crearea unei acțiuni este foarte asemănătoare cu crearea unei metode instanță. De fapt, @IBAction atributul nu este altceva decât un indiciu pentru Interface Builder. Prefixând o metodă cu @IBAction atributul, asiguram ca Interface Builder este constient de metoda care ne permite sa o conectam in storyboard. Vom lăsa acum corpurile ambelor acțiuni goale.

clasa AddItemViewController: UIViewController @IBOutlet var textField: UITextField! override funcția viewDidLoad () super.viewDidLoad () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning () @IBAction func anulare (_ expeditor: Oricare)  @IBAction func create (_ expeditor: Oricare) 

Pasul 3: Creați interfața de utilizator

Deschis Main.storyboard în Project Navigator și trageți a Vizualizați controlerul de la Biblioteca de obiecte pe dreapta. Cu controlerul de vizualizare selectat, deschideți Inspectorul de identitate pe dreapta și pe set Clasa personalizată> Clasă la AddItemViewController.

Pentru a adăuga o bară de navigare în ecranul de adăugare a elementelor, selectați Adăugați controler de vizualizare a elementului și alegeți Încorporați în> Controller de navigare de la Editor meniul. Acest lucru va face Adăugați controler de vizualizare a elementului controlerul de vedere al radacinii unui controler de navigație.

Următorul pas este să adăugați un element de buton de bare în bara de navigare a Vizualizați controlerul-Nu Adăugați controler de vizualizare a elementului-și setați-o Identificator la Adăuga în Atribuții Inspector.

Atunci când utilizatorul pune în funcțiune Adăuga butonul, Adăugați controler de vizualizare a elementului ar trebui prezentată modal. Pentru a realiza acest lucru, apăsați pe Control cheie și trageți de la Adăuga butonul pentru a Controller de navigație, selectare Prezentați modal din meniul care apare. Acest lucru va crea o segue de la Adăugați controler de vizualizare a elementului la noul Controller de navigație.

Glisați un câmp de text și un buton din Biblioteca de obiecte și adăugați-le la Adăugați controler de vizualizare a elementului scenă. Selectează Adăugați controler de vizualizare a elementului și conectați textfield ieșiți cu câmpul de text și crea(_:) acțiune cu butonul. crea(_:) acțiunea ar trebui declanșată atunci când Touch Up Inside evenimentul este declanșat. Schimbați titlul butonului Crea și adăugați constrângerile de aspect necesare câmpului și butonul text.

Pentru a finaliza interfața cu utilizatorul, adăugați un element de buton de bare în partea stângă sus a barei de navigare a Adăugați controler de vizualizare a elementului și setați-o Identificator la Anulare. Cu Adăugați controler de vizualizare a elementului selectați, deschideți Conectarea inspectorului și conectați Anulare(_:) acțiune la adresa Anulare buton.

Construiți și executați aplicația apăsând Command-R pentru a verifica dacă totul este conectat corect.

2. Implementarea unui protocol delegat

Atunci când utilizatorul pune în funcțiune Crea pentru a adăuga un element de rezolvat, controlerul de vizualizare a elementelor de adăugare trebuie să anunțe controlerul de vizualizare. Delegația este o soluție perfectă pentru acest scenariu. Procesul este destul de simplu.

Creăm un protocol delegat ViewController clasa se conformează. Cand AddItemViewController instanta este creata - atunci cand utilizatorul intrerupe Adăuga Butonul-the ViewController obiect este stabilit ca delegat al AddItemViewController instanță, pentru a permite acestuia din urmă să notifice ViewController atunci când se creează un nou element de rezolvat. Să înțelegem mai bine acest proces.

Pasul 1: Declarați AddItemViewControllerDelegate Protocol

Deschis AddItemViewController.swift și declarați AddItemViewControllerDelegate protocol de mai jos declarația de import din partea de sus. Declarația protocolului arată similar cu o declarație de clasă. protocol cuvântul cheie este urmat de numele protocolului.

importați protocolul UIKit AddItemViewControllerDelegate func controller (controler _: AddItemViewController, didAddItem: String)

Conceptul este foarte similar cu protocoalele din Obiectiv-C. Numele protocolului este AddItemViewControllerDelegate și definește o metodă, controler (_: didAddItem :).

Pasul 2: Declarați delega Proprietate

Obiectul care are nevoie de implementarea protocolului delegat este delegatul lui AddItemViewController. Trebuie mai întâi să creați o proprietate pentru delegat, așa cum se arată în fragmentul de mai jos.

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

 delega proprietatea este de tip AddItemViewControllerDelegate?, un tip opțional, deoarece nu putem fi siguri că delega proprietatea nu este zero. Rețineți că numele protocolului nu este înfășurat în paranteze unghiulare ca în Obiectiv-C.

Pasul 3: Implementarea acțiunilor

Metoda delegatului, controler (_: didAddItem :), va fi invocată în crea(_:) acțiune după cum se arată mai jos. Pentru a păstra exemplul simplu, nu facem nici o validare a intrării utilizatorului.

Folosim lanțul opțional pentru a invoca metoda delegatului pe obiectul delegat, ceea ce înseamnă că metoda delegat este invocată numai dacă delega proprietatea este setată. Valoarea câmpului de text este temporar stocată într-o constantă, articol.

@IBAction func create (_ expeditor: Oricare) if let item = textField.text delegate? .Controller (auto, didAddItem: item)

Punerea în aplicare a directivei Anulare(_:) acțiunea este ușoară. Tot ce facem este să respingem AddItemViewController instanță.

@IBAction func cancel (_ expeditor: Oricare) respinge (animat: true)

Pasul 4: Setați delegatul

Există însă o bucată din puzzle care lipsește. delega proprietate a AddItemViewController instanța nu este stabilită în acest moment. Putem rezolva acest lucru prin implementarea pregăti (pentru: expeditor :) metodă în ViewController clasă. În primul rând, însă, trebuie să revedem tabloul de bord.

Deschis Main.storyboard și selectați conexiunea sigură Adăuga cu butonul cu Controller de navigație. Deschide Atribuții Inspector și a stabilit-o Identificator laAddItemViewController.

Apoi, implementați pregăti (pentru: expeditor :) metodă în ViewController clasa, după cum se arată mai jos. Rețineți trece peste cuvinte cheie prefixarea metodei. Acest lucru ar trebui să fie familiar până acum.

override func prepare (pentru segue: UIStoryboardSegue, expeditor: Any?) if segue.identifier == "AddItemViewController" let navigationController = segue.destination as? UINavigationController lăsați addItemViewController = navigationController? .TopViewController ca? AddItemViewController dacă lăsați viewController = addItemViewController viewController.delegate = auto

Începem prin a verifica identificatorul segmentelor, asigurându-ne că ne pregătim pentru corectitudinea corectă. Apoi îi întrebăm pe segue pentru controlerul de vizualizare a destinației. Vă puteți aștepta ca acesta să fie AddItemViewController dar nu uitați că am făcut controlerul de vizualizare controlerul de vizualizare rădăcină al unui controler de navigație. Asta înseamnă că trebuie să cerem controlorului de navigație, controlerului de vizualizare a destinației, pentru controlerul său de vedere superior.

addItemViewController constanta este de tip AddItemViewController? din cauza utilizării la fel de? cuvinte cheie. Cu alte cuvinte, prin utilizarea la fel de? am scazut valoarea topViewController proprietate la un tip opțional.

În dacă , extragem opțional și setăm delega proprietate la ViewController instanță.

Sunt sigur că ați observat utilizarea mai multor opțiuni în implementarea pregăti (pentru: expeditor :) metodă. Când interacționați cu API-urile Obiectiv-C, este întotdeauna mai bine să le jucați în siguranță. În timp ce trimiteți mesaje către zero este perfect în Obiectiv-C, nu este în Swift. Din cauza acestei diferențe esențiale, întotdeauna trebuie să fii atent atunci când interacționezi cu API-urile Objective-C în Swift. Exemplul de mai sus ilustrează acest lucru bine.

Pasul 5: Implementați AddItemViewControllerDelegate Protocol

Implementarea sistemului AddItemViewControllerDelegate protocol este similar cu punerea în aplicare a UITableViewDataSource protocol. Începem prin conformarea ViewController clasa la protocol, după cum se arată mai jos.

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

Apoi implementăm metodele AddItemViewControllerDelegate protocol, care se reduce la implementarea controler (_: didAddItem :) metodă. Adăugăm noul element la controlerul de vizualizare articole proprietăți, reîncărcați vizualizarea tabelului și închideți controlerul de vizualizare a elementului de adăugare.

// MARK: Adăugare element Vizualizare controler Delegate Metode func controler (_ controler: AddItemViewController, didAddItem: String) // Update Sursa de date items.append (didAddItem) // Reîncărcare tabelă View tableView.reloadData () // Dismiss Add Item View Controlorul respinge (animat: adevărat)

Pasul 6: Construiți și executați

Construiți și executați aplicația pentru a testa dacă puteți adăuga elemente noi în lista de sarcini. Momentan nu validăm intrarea utilizatorului. Ca exercițiu, afișați o vizualizare de alertă pentru utilizator dacă atinge Crea și câmpul text este gol. Adăugarea unei cereri goale nu este foarte utilă. Dreapta?

Concluzie

În această lecție, ați învățat cum să declarați și să implementați un protocol personalizat. De asemenea, ați învățat cum să creați acțiuni și să le cuplați în Interface Builder. În următoarea lecție, vom finaliza aplicația noastră de rezolvare prin adăugarea abilității de a șterge elementele de rezolvat și vom îmbunătăți și experiența utilizatorului.

Între timp, verificați câteva dintre celelalte cursuri și tutoriale despre dezvoltarea iOS a limbajului Swift!

Cod