Manualului lipsă
pentru dezvoltarea Swift
Ghidul pe care mi-aș fi dorit să-l am când am început
Alăturați-vă la 20,000+ de dezvoltatori care învață despre dezvoltarea Swift
Descărcați exemplarul gratuit
Proiectul Photos folosește exclusiv storyboard-uri pentru a proiecta și crea controlori de vizualizare. În acest episod, vă arăt că modelul coordonator nu se limitează la storyboard-uri. Puteți utiliza modelul coordonator și dacă preferați fișierele XIB în locul storyboard-urilor. Dacă preferați să nu folosiți niciunul dintre ele, atunci și acest lucru este posibil. Nu contează modul în care proiectați și creați controlorii de vizualizare ai proiectului dumneavoastră.
Proiect de pornire
Proiectul de pornire din acest episod este identic din punct de vedere funcțional cu proiectul finalizat din episodul anterior. Totuși, există câteva diferențe pe care vreau să le subliniez. Clasa TermsViewController
nu mai este conformă cu protocolul Storyboardable
și are acum trei subclase, TermsViewControllerStoryboard
, TermsViewControllerXIB
și TermsViewControllerCode
.
Clasa TermsViewControllerStoryboard
este identică cu clasa TermsViewController
din episodul anterior. Interfața utilizator a clasei TermsViewControllerStoryboard
este definită în Main.storyboard. Putem instanția o instanță a clasei prin invocarea metodei instantiate()
a protocolului Storyboardable
.
Interfața utilizator a clasei TermsViewControllerXIB
este definită în TermsViewControllerXIB.xib. Clasa TermsViewControllerXIB
definește o proprietate statică, variabilă, nibName
, pentru a evita utilizarea șirurilor literale. Aceasta este similară proprietății storyboardIdentifier
definită în Storyboardable.swift.
După cum sugerează și numele, clasa TermsViewControllerCode
nu are o legătură cu un storyboard sau cu un fișier XIB. Interfața cu utilizatorul este creată în cod. În mod evident, acest lucru are ca rezultat un cod destul de mare. Să aruncăm o privire asupra fiecăruia dintre acești controlori de vizualizare și să explorăm modul în care se încadrează în modelul coordonator.
Storyboards
Storyboards există de câțiva ani, iar Apple încurajează dezvoltatorii să le folosească. Eu folosesc storyboards în majoritatea proiectelor la care lucrez. Xcode creează automat un storyboard atunci când creați un proiect nou, dar vă recomand cu tărie să folosiți mai multe storyboard-uri mai mici în loc de un singur storyboard mare. Utilizând mai multe storyboard-uri mai mici, puteți evita mai ușor conflictele de fuziune, iar lucrul cu storyboard-uri mai mici este mai rapid și mai puțin complex.
Seguințele sunt o caracteristică cheie a storyboard-urilor, dar nu le folosesc niciodată în combinație cu modelul coordonator. Deși este posibil să se utilizeze segues în combinație cu modelul coordonator, un segue implică controlorul de vizualizare în fluxul aplicației și acesta este un lucru pe care dorim să-l evităm. Amintiți-vă că coordonatorii proiectului se ocupă de fluxul aplicației. Un controler de vizualizare nu trebuie să știe nimic despre fluxul aplicației și nu trebuie să știe despre alți controlori de vizualizare.
Chiar și fără secvențe, storyboard-urile au valoarea lor. Eu întotdeauna împart proiectele medii și mari în module. Fiecare modul are un storyboard, care conține controlorii de vizualizare ai modulului.
Deschideți TermsCoordinator.swift și navigați până la metoda showTerms()
. Implementarea este identică cu cea a proiectului finalizat din episodul anterior. Singura diferență este numele clasei controlorilor de vizualizare. Coordonatorul de termeni instanțiază clasa TermsViewControllerStoryboard
în loc de clasa TermsViewController
.
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerStoryboard.instantiate() // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
XIBs
Filele XIB au existat încă din primele zile ale dezvoltării Cocoa. Le lipsesc câteva caracteristici în comparație cu storyboard-urile, dar încă au valoarea lor. Eu folosesc în principal XIB-urile pentru componente reutilizabile, cum ar fi celulele de vizualizare a tabelelor și celulele de vizualizare a colecțiilor.
Deschideți termeniiViewControllerXIB.xib. Interfața utilizator a clasei TermsViewControllerXIB
este identică cu cea a clasei TermsViewControllerStoryboard
din Main.storyboard. Deschideți TermsCoordinator.swift și revizitați metoda showTerms()
. Pentru a crea o instanță a clasei TermsViewControllerXIB
, invocăm inițializatorul init(nibName:bundle:)
, trecând numele fișierului XIB și o referință la pachetul care conține fișierul XIB.
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerXIB(nibName: TermsViewControllerXIB.nibName, bundle: .main) // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
Code
De asemenea, este posibil să se creeze în cod interfața utilizator a controlorilor de vizualizare din proiect. Dacă nu vă plac storyboard-urile sau fișierele XIB, atunci aceasta este singura dvs. opțiune. Nu am folosit foarte mult această opțiune de la introducerea storyboard-urilor, dar poate fi utilă din când în când.
Crearea și inițializarea unui controler de vizualizare în cod este utilă dacă acel controler de vizualizare are o interfață utilizator complexă sau dinamică. Crearea și inițializarea controlorilor de vizualizare în cod are un alt beneficiu convingător. Acesta permite injectarea inițializatorului, o formă de injectare a dependenței. Voi discuta despre injecția de dependență în episodul următor.
Pentru a crea o instanță a clasei TermsViewControllerCode
, invocăm inițializatorul init()
. Acest lucru este echivalent cu invocarea inițializatorului init(nibName:bundle:)
și trecerea în nil
pentru ambele argumente.
// MARK: - Helper Methodsprivate func showTerms() { // Initialize Terms View Controller let termsViewController = TermsViewControllerCode() // Install Handlers termsViewController.didCancel = { in self?.finish() } // Present Terms View Controller presentingViewController.present(termsViewController, animated: true)}
Ce urmează?
Patronul coordonator este un model flexibil. Nu contează dacă folosiți storyboard-uri, fișiere XIB sau niciuna dintre ele. Puteți folosi secvențe, dar nu uitați că, dacă o faceți, încălcați un principiu fundamental al modelului coordonator. Un controler de vizualizare nu trebuie să știe despre fluxul aplicației și nu ar trebui să știe despre alți controlori de vizualizare.