The Missing Manual
for Swift Development
Guiden jag önskar att jag hade haft när jag började
Samarbeta med 20,000+ utvecklare som lär sig om Swift-utveckling
Ladda ner ditt gratisexemplar
Projektet Photos använder uteslutande storyboards för att designa och skapa view controllers. I det här avsnittet visar jag dig att koordinatormönstret inte är begränsat till storyboards. Du kan också använda koordinatormönstret om du föredrar XIB-filer framför storyboards. Om du föredrar att använda varken det ena eller det andra är det också möjligt. Det spelar ingen roll hur du utformar och skapar vykontrollerna i ditt projekt.
Startprojekt
Startprojektet i det här avsnittet är funktionellt identiskt med det färdiga projektet i föregående avsnitt. Det finns dock några skillnader som jag vill påpeka. Klassen TermsViewController
följer inte längre protokollet Storyboardable
och den har nu tre underklasser, TermsViewControllerStoryboard
, TermsViewControllerXIB
och TermsViewControllerCode
.
Klassen TermsViewControllerStoryboard
är identisk med klassen TermsViewController
i föregående avsnitt. Användargränssnittet för klassen TermsViewControllerStoryboard
definieras i Main.storyboard. Vi kan instantiera en instans av klassen genom att åberopa instantiate()
-metoden i Storyboardable
-protokollet.
Användargränssnittet för TermsViewControllerXIB
-klassen definieras i TermsViewControllerXIB.xib. Klassen TermsViewControllerXIB
definierar en statisk, variabel egenskap, nibName
, för att undvika användning av stränglitteraler. Detta liknar egenskapen storyboardIdentifier
som definieras i Storyboardable.swift.
Som namnet antyder har TermsViewControllerCode
-klassen ingen länk till en storyboard eller en XIB-fil. Användargränssnittet skapas i kod. Detta resulterar naturligtvis i en hel del mer kod. Låt oss ta en titt på var och en av dessa view controllers och undersöka hur de passar in i koordinatormönstret.
Storyboards
Storyboards har funnits i flera år och Apple uppmuntrar utvecklare att använda dem. Jag använder storyboards i de flesta projekt jag arbetar med. Xcode skapar automatiskt en storyboard när du skapar ett helt nytt projekt, men jag rekommenderar starkt att du använder flera mindre storyboards istället för en stor storyboard. Genom att använda flera mindre storyboards kan du lättare undvika sammanfogningskonflikter och att arbeta med mindre storyboards är snabbare och mindre komplicerat.
Seggar är en viktig funktion i storyboards, men jag använder dem aldrig i kombination med koordinatormönstret. Det är visserligen möjligt att använda segues i kombination med koordinatormönstret, men en segue involverar view controller i applikationsflödet och det är något vi vill undvika. Kom ihåg att projektets samordnare hanterar programflödet. En vykontrollant behöver inte veta något om programflödet och den behöver inte veta något om andra vykontrollanter.
Även utan segues har storyboards sitt värde. Jag delar alltid upp medelstora till stora projekt i moduler. Varje modul har en storyboard, som innehåller modulens view controllers.
Öppna TermsCoordinator.swift och navigera till metoden showTerms()
. Genomförandet är identiskt med det färdiga projektet i föregående avsnitt. Den enda skillnaden är namnet på klassen för visningskontrollanten. Terms coordinator instantierar klassen TermsViewControllerStoryboard
istället för 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
XIB-filer har funnits sedan Cocoautvecklingens tidiga dagar. De saknar några funktioner jämfört med storyboards, men de har fortfarande sitt värde. Jag använder i första hand XIB-filer för återanvändbara komponenter, till exempel tabellvyns celler och samlingsvyns celler.
Öppna termerViewControllerXIB.xib. Användargränssnittet för TermsViewControllerXIB
-klassen är identiskt med det för TermsViewControllerStoryboard
-klassen i Main.storyboard. Öppna TermsCoordinator.swift och återbesök metoden showTerms()
. För att skapa en instans av TermsViewControllerXIB
-klassen åberopar vi init(nibName:bundle:)
-initieraren och överlämnar namnet på XIB-filen och en referens till det paket som innehåller XIB-filen.
// 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)}
Kod
Det är också möjligt att skapa användargränssnittet för projektets visningskontrollanter i kod. Om du inte gillar storyboards eller XIB-filer är detta ditt enda alternativ. Jag har inte använt det här alternativet särskilt mycket sedan införandet av storyboards, men det kan vara användbart då och då.
Skapa och initiera en vykontrollant i kod är användbart om den vykontrollanten har ett komplext eller dynamiskt användargränssnitt. Att skapa och initialisera view controllers i kod har en annan övertygande fördel. Det möjliggör initializer injection, en form av beroendeinjektion. Jag diskuterar beroendeinjektion i nästa avsnitt.
För att skapa en instans av TermsViewControllerCode
-klassen åberopar vi init()
-initieraren. Detta är likvärdigt med att åberopa init(nibName:bundle:)
initializer och överlämna nil
för båda argumenten.
// 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)}
What’s Next?
Koordinatormönstret är ett flexibelt mönster. Det spelar ingen roll om du använder storyboards, XIB-filer eller ingetdera. Du kan använda segues, men kom ihåg att du bryter mot en grundläggande princip i koordinatormönstret om du gör det. En visningskontrollant behöver inte känna till programflödet och bör inte känna till andra visningskontrollanter.