The Missing Manual
for Swift Development
The Guide I Wish I Wish I had When I Started Out
Join 20,000+ Developers Learning About Swift Development
Lataa ilmainen kappaleesi
Kuvat-projektissa käytetään yksinomaan storyboardeja näkymäohjainten suunnitteluun ja luomiseen. Tässä jaksossa näytän, että koordinaattorimalli ei rajoitu storyboardeihin. Voit käyttää koordinaattorimallia myös, jos pidät XIB-tiedostoja storyboardien sijaan. Jos haluat käyttää kumpaakaan, sekin on mahdollista. Sillä ei ole väliä, miten suunnittelet ja luot projektisi näkymäohjaimet.
Starttiprojekti
Tämän jakson starttiprojekti on toiminnallisesti identtinen edellisen jakson valmiin projektin kanssa. On kuitenkin muutamia eroja, jotka haluan tuoda esiin. Luokka TermsViewController
ei enää noudata Storyboardable
-protokollaa, ja sillä on nyt kolme alaluokkaa, TermsViewControllerStoryboard
, TermsViewControllerXIB
ja TermsViewControllerCode
.
Luokka TermsViewControllerStoryboard
on identtinen edellisen jakson TermsViewController
-luokan kanssa. TermsViewControllerStoryboard
-luokan käyttöliittymä on määritelty kohdassa Main.storyboard. Voimme instansioida luokan instanssin kutsumalla Storyboardable
-protokollan instantiate()
-metodia.
Luokan TermsViewControllerXIB
käyttöliittymä on määritelty kohdassa TermsViewControllerXIB.xib. TermsViewControllerXIB
-luokka määrittelee staattisen, muuttuvan ominaisuuden nibName
, jolla vältetään merkkijonokirjainten käyttö. Tämä on samanlainen kuin Storyboardable.swift-luokassa määritelty storyboardIdentifier
-ominaisuus.
Kuten nimestä voi päätellä, TermsViewControllerCode
-luokalla ei ole linkkiä storyboardiin tai XIB-tiedostoon. Käyttöliittymä luodaan koodissa. Tämä johtaa luonnollisesti melko paljon enemmän koodia. Tutustutaanpa kuhunkin näistä näkymäohjaimista ja tutkitaan, miten ne sopivat koordinaattorimalliin.
Storyboardit
Storyboardit ovat olleet olemassa jo useita vuosia, ja Apple kannustaa kehittäjiä käyttämään niitä. Käytän storyboardeja useimmissa projekteissa, joiden parissa työskentelen. Xcode luo automaattisesti storyboardin, kun luot upouuden projektin, mutta suosittelen vahvasti käyttämään useita pienempiä storyboardeja yhden suuren storyboardin sijaan. Käyttämällä useita pienempiä storyboardeja vältät helpommin yhdistämisristiriidat, ja työskentely pienemmillä storyboardeilla on nopeampaa ja yksinkertaisempaa.
Segut ovat storyboardien keskeinen ominaisuus, mutta en koskaan käytä niitä yhdessä koordinaattorikuvion kanssa. Vaikka seguja on mahdollista käyttää yhdessä koordinaattorikuvion kanssa, seguessa näkymäohjain osallistuu sovellusvirtaan, ja sitä haluamme välttää. Muista, että projektin koordinaattorit käsittelevät sovellusvirtaa. Näkymäohjaimen ei tarvitse tietää mitään sovellusvirrasta eikä sen tarvitse tietää muista näkymäohjaimista.
Jopa ilman seguja tarinakaavioilla on arvonsa. Jaan keskisuuret ja suuret projektit aina moduuleihin. Jokaisella moduulilla on storyboard, joka sisältää moduulin näkymäohjaimet.
Avaa TermsCoordinator.swift ja siirry showTerms()
-metodiin. Toteutus on identtinen edellisen jakson valmiin projektin kanssa. Ainoa ero on näkymäohjainluokan nimi. Termikoordinaattori instantioi TermsViewControllerStoryboard
-luokan TermsViewController
-luokan sijaan.
// 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)}
XIB:t
XIB-tiedostot ovat olleet olemassa Cocoa-kehityksen alkuajoista lähtien. Niistä puuttuu muutamia ominaisuuksia storyboardeihin verrattuna, mutta niillä on silti arvonsa. Käytän XIB-tiedostoja pääasiassa uudelleenkäytettäviin komponentteihin, kuten taulukkonäkymän soluihin ja kokoelmanäkymän soluihin.
Avaa termitViewControllerXIB.xib. TermsViewControllerXIB
-luokan käyttöliittymä on identtinen Main.storyboardin TermsViewControllerStoryboard
-luokan käyttöliittymän kanssa. Avaa TermsCoordinator.swift ja käy uudelleen läpi showTerms()
-metodi. Luodaksemme TermsViewControllerXIB
-luokan instanssin kutsumme init(nibName:bundle:)
-initiaattoria, jolloin välitämme XIB-tiedoston nimen ja viittauksen XIB-tiedoston sisältävään nippuun.
// 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
Projektin näkymäohjainten käyttöliittymä on mahdollista luoda myös koodissa. Jos et pidä storyboardeista tai XIB-tiedostoista, tämä on ainoa vaihtoehtosi. En ole käyttänyt tätä vaihtoehtoa kovinkaan paljon storyboardien käyttöönoton jälkeen, mutta siitä voi olla hyötyä silloin tällöin.
Näkymäohjaimen luominen ja alustaminen koodissa on hyödyllistä, jos kyseisellä näkymäohjaimella on monimutkainen tai dynaaminen käyttöliittymä. Näkymäohjainten luomisella ja alustamisella koodissa on toinenkin pakottava hyöty. Se mahdollistaa initializer injectionin, eräänlaisen riippuvuusinjektion. Käsittelen riippuvuusinjektiota seuraavassa jaksossa.
Luoaksemme TermsViewControllerCode
-luokan instanssin, kutsumme init()
-initiaattoria. Tämä vastaa sitä, että kutsumme init(nibName:bundle:)
-initiaattoria ja annamme molempina argumentteina nil
.
// 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)}
Mitä seuraavaksi?
Koordinaattorimalli on joustava malli. Sillä ei ole väliä, käytätkö storyboardeja, XIB-tiedostoja vai et kumpaakaan. Voit käyttää seguja, mutta muista, että silloin rikot koordinaattorikuvion perusperiaatetta. Näkymänohjaimen ei tarvitse tietää sovelluksen kulusta eikä sen pitäisi tietää muista näkymänohjaimista.