The Missing Manual
for Swift Development
The Guide I Wish I Had When I Start Out
Medoen met 20,000+ ontwikkelaars die leren over Swift-ontwikkeling
Download Your Free Copy
Het project Photos maakt uitsluitend gebruik van storyboards voor het ontwerpen en maken van view controllers. In deze aflevering laat ik je zien dat het coördinator patroon niet beperkt is tot storyboards. Je kunt het coördinator patroon ook gebruiken als je liever XIB bestanden gebruikt dan storyboards. Als je liever geen van beide gebruikt, dan kan dat ook. Het maakt niet uit hoe je de view controllers van je project ontwerpt en maakt.
Starter Project
Het starter project van deze aflevering is functioneel identiek aan het voltooide project van de vorige aflevering. Er zijn echter een paar verschillen waar ik op wil wijzen. De TermsViewController
klasse voldoet niet langer aan het Storyboardable
protocol en het heeft nu drie subklassen, TermsViewControllerStoryboard
, TermsViewControllerXIB
, en TermsViewControllerCode
.
De TermsViewControllerStoryboard
klasse is identiek aan de TermsViewController
klasse van de vorige aflevering. De gebruikersinterface van de TermsViewControllerStoryboard
klasse is gedefinieerd in Main.storyboard. We kunnen een instantie van de klasse instantiëren door de instantiate()
methode van het Storyboardable
protocol aan te roepen.
De gebruikersinterface van de TermsViewControllerXIB
klasse is gedefinieerd in TermsViewControllerXIB.xib. De klasse TermsViewControllerXIB
definieert een statische, variabele eigenschap, nibName
, om het gebruik van string literals te vermijden. Dit is vergelijkbaar met de storyboardIdentifier
property gedefinieerd in Storyboardable.swift.
Zoals de naam al aangeeft, heeft de TermsViewControllerCode
klasse geen koppeling naar een storyboard of een XIB bestand. De gebruikersinterface wordt in code gemaakt. Dit resulteert uiteraard in heel wat meer code. Laten we eens kijken naar elk van deze view controllers en onderzoeken hoe ze passen in het coördinator patroon.
Storyboards
Storyboards zijn er al een aantal jaren en Apple moedigt ontwikkelaars aan om ze te gebruiken. Ik gebruik storyboards in de meeste projecten waar ik aan werk. Xcode maakt automatisch een storyboard als je een nieuw project maakt, maar ik raad je sterk aan om meerdere kleinere storyboards te gebruiken in plaats van één groot storyboard. Door meerdere kleinere storyboards te gebruiken, kun je samenvoegconflicten gemakkelijker vermijden en het werken met kleinere storyboards is sneller en minder complex.
Segues zijn een belangrijk kenmerk van storyboards, maar ik gebruik ze nooit in combinatie met het coördinatorpatroon. Hoewel het mogelijk is om segues te gebruiken in combinatie met het coördinator patroon, betrekt een segue de view controller in de applicatie flow en dat is iets wat we willen vermijden. Onthoud dat de coördinatoren van het project de applicatiestroom afhandelen. Een view controller hoeft niets te weten over de applicatie flow en het hoeft niets te weten over andere view controllers.
Zelfs zonder segues, storyboards hebben hun waarde. Ik deel middelgrote tot grote projecten altijd op in modules. Elke module heeft een storyboard, dat de view controllers van de module bevat.
Open TermsCoordinator.swift en navigeer naar de showTerms()
methode. De implementatie is identiek aan die van het voltooide project van de vorige aflevering. Het enige verschil is de naam van de view controller klasse. De termen coördinator instantieert de TermsViewControllerStoryboard
klasse in plaats van de TermsViewController
klasse.
// 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 bestanden zijn er al sinds de begindagen van Cocoa ontwikkeling. Ze missen een paar functies in vergelijking met storyboards, maar ze hebben nog steeds hun waarde. Ik gebruik XIBs voornamelijk voor herbruikbare componenten, zoals tabel view cellen en collectie view cellen.
Open TermsViewControllerXIB.xib. De gebruikersinterface van de TermsViewControllerXIB
klasse is identiek aan die van de TermsViewControllerStoryboard
klasse in Main.storyboard. Open TermsCoordinator.swift en herbekijk de showTerms()
-methode. Om een instantie van de klasse TermsViewControllerXIB
te maken, roepen we de init(nibName:bundle:)
initializer op, waarbij we de naam van het XIB-bestand en een verwijzing naar de bundel met het XIB-bestand doorgeven.
// 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
Het is ook mogelijk om de gebruikersinterface van de view controllers van het project in code te maken. Als je niet van storyboards of XIB bestanden houdt, dan is dit je enige optie. Ik heb deze optie niet veel meer gebruikt sinds de introductie van storyboards, maar het kan van tijd tot tijd handig zijn.
Het maken en initialiseren van een view controller in code is handig als die view controller een complexe of dynamische gebruikersinterface heeft. Het creëren en initialiseren van view controllers in code heeft een ander overtuigend voordeel. Het maakt initializer injection mogelijk, een vorm van dependency injection. Ik bespreek dependency injection in de volgende aflevering.
Om een instantie van de TermsViewControllerCode
class te maken, roepen we de init()
initializer aan. Dit komt overeen met het aanroepen van de init(nibName:bundle:)
initializer en het invoeren van nil
voor beide 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?
Het coördinator patroon is een flexibel patroon. Het maakt niet uit of je storyboards gebruikt, XIB files, of geen van beide. Je kunt segues gebruiken, maar vergeet niet dat je een fundamenteel principe van het coördinator patroon schendt als je dat doet. Een view controller hoeft niets te weten over de applicatie flow en mag niets weten over andere view controllers.