Î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.
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.
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ă.
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.
Î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)
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.
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.
AddItemViewControllerDelegate
ProtocolDeschis 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 :)
.
delega
ProprietateObiectul 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.
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)
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.
AddItemViewControllerDelegate
ProtocolImplementarea 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)
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?
Î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!