The Missing Manual
for Swift Development
The Guide I Wish I Wish I Had When I Started Out
Deltag i 20,000+ udviklere, der lærer om Swift-udvikling
Download dit gratis eksemplar
Fotos-projektet bruger udelukkende storyboards til at designe og oprette view controllers. I denne episode viser jeg dig, at koordinatormønsteret ikke er begrænset til storyboards. Du kan også bruge koordinatormønsteret, hvis du foretrækker XIB-filer frem for storyboards. Hvis du foretrækker at bruge hverken det ene eller det andet, så er det også muligt. Det er ligegyldigt, hvordan du designer og opretter viewcontrollerne i dit projekt.
Startprojekt
Startprojektet i denne episode er funktionelt identisk med det færdige projekt i den foregående episode. Der er dog et par forskelle, som jeg vil påpege. Klassen TermsViewController
er ikke længere i overensstemmelse med Storyboardable
-protokollen, og den har nu tre underklasser, TermsViewControllerStoryboard
, TermsViewControllerXIB
og TermsViewControllerCode
.
Klassen TermsViewControllerStoryboard
er identisk med TermsViewController
-klassen fra den foregående episode. Brugergrænsefladen for TermsViewControllerStoryboard
-klassen er defineret i Main.storyboard. Vi kan instantiere en instans af klassen ved at påkalde instantiate()
-metoden i Storyboardable
-protokollen.
Brugergrænsefladen for TermsViewControllerXIB
-klassen er defineret i TermsViewControllerXIB.xib. TermsViewControllerXIB
-klassen definerer en statisk, variabel egenskab, nibName
, for at undgå brugen af strenglitteraler. Dette svarer til storyboardIdentifier
-egenskaben, der er defineret i Storyboardable.swift.
Som navnet antyder, har TermsViewControllerCode
-klassen ikke et link til et storyboard eller en XIB-fil. Brugergrænsefladen oprettes i kode. Dette resulterer naturligvis i en hel del mere kode. Lad os tage et kig på hver af disse viewcontrollere og undersøge, hvordan de passer ind i koordinatormønsteret.
Storyboards
Storyboards har eksisteret i flere år, og Apple opfordrer udviklere til at bruge dem. Jeg bruger storyboards i de fleste projekter, jeg arbejder på. Xcode opretter automatisk et storyboard, når du opretter et helt nyt projekt, men jeg anbefaler på det kraftigste at bruge flere mindre storyboards i stedet for ét stort storyboard. Ved at bruge flere mindre storyboards kan du lettere undgå sammenføjningskonflikter, og det er hurtigere og mindre komplekst at arbejde med mindre storyboards.
Segninger er en vigtig funktion i storyboards, men jeg bruger dem aldrig i kombination med koordinatormønsteret. Det er muligt at bruge segues i kombination med koordinatormønsteret, men en segue involverer viewcontrolleren i applikationsflowet, og det er noget, vi gerne vil undgå. Husk, at koordinatorerne i projektet håndterer applikationsflowet. En viewcontroller behøver ikke at vide noget om applikationsflowet, og den behøver ikke at vide noget om andre viewcontrollere.
Selv uden segues har storyboards deres værdi. Jeg deler altid mellemstore til store projekter op i moduler. Hvert modul har et storyboard, som indeholder modulets viewcontrollere.
Åbn TermsCoordinator.swift, og naviger til showTerms()
-metoden. Implementeringen er identisk med den i det færdige projekt i den foregående episode. Den eneste forskel er navnet på visningscontrollerklassen. Terms coordinator instantierer TermsViewControllerStoryboard
-klassen i stedet for TermsViewController
-klassen.
// 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 eksisteret siden de tidlige dage af Cocoa-udviklingen. De mangler et par funktioner sammenlignet med storyboards, men de har stadig deres værdi. Jeg bruger primært XIB’er til genanvendelige komponenter, f.eks. tabelvisningsceller og opsamlingsvisningsceller.
Åbn TermerViewControllerXIB.xib. Brugergrænsefladen i TermsViewControllerXIB
-klassen er identisk med brugergrænsefladen i TermsViewControllerStoryboard
-klassen i Main.storyboard. Åbn TermsCoordinator.swift, og genbesøg showTerms()
-metoden. For at oprette en instans af TermsViewControllerXIB
-klassen kalder vi init(nibName:bundle:)
-initialisatoren og overfører navnet på XIB-filen og en henvisning til det bundle, der indeholder 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)}
Kode
Det er også muligt at oprette brugergrænsefladen for projektets viewcontrollere i kode. Hvis du ikke bryder dig om storyboards eller XIB-filer, så er dette din eneste mulighed. Jeg har ikke brugt denne mulighed særlig meget siden indførelsen af storyboards, men den kan være nyttig fra tid til anden.
Skabelse og initialisering af en view controller i kode er nyttig, hvis denne view controller har en kompleks eller dynamisk brugergrænseflade. Oprettelse og initialisering af viewcontrollere i kode har en anden overbevisende fordel. Det giver mulighed for initializer-injektion, en form for injektion af afhængighed. Jeg diskuterer injektion af afhængighed i næste afsnit.
For at oprette en instans af TermsViewControllerCode
-klassen kalder vi init()
-initializeren. Dette svarer til at påkalde init(nibName:bundle:)
-initializeren og overgive nil
for begge argumenter.
// 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)}
Hvad er det næste?
Koordinatormønsteret er et fleksibelt mønster. Det er ligegyldigt, om du bruger storyboards, XIB-filer eller ingen af delene. Du kan bruge segues, men husk, at du overtræder et grundlæggende princip i koordinatormønstret, hvis du gør det. En view controller behøver ikke at vide noget om programflowet, og den bør ikke vide noget om andre view controllere.