The Missing Manual
for Swift Development
The Guide I Wish I Had When I Started Out
Join 20,000+ Sviluppatori che imparano lo sviluppo Swift
Scarica la tua copia gratuita
Il progetto Photos usa esclusivamente gli storyboard per progettare e creare i controller delle viste. In questo episodio, ti mostro che il pattern coordinatore non è limitato agli storyboard. Puoi usare il pattern coordinatore anche se preferisci i file XIB agli storyboard. Se preferite non usare nessuno dei due, anche questo è possibile. Non importa come disegni e crei i controller delle viste del tuo progetto.
Progetto iniziale
Il progetto iniziale di questo episodio è funzionalmente identico al progetto finito dell’episodio precedente. Ci sono però alcune differenze che voglio sottolineare. La classe TermsViewController
non è più conforme al protocollo Storyboardable
e ora ha tre sottoclassi, TermsViewControllerStoryboard
, TermsViewControllerXIB
e TermsViewControllerCode
.
La classe TermsViewControllerStoryboard
è identica alla classe TermsViewController
dell’episodio precedente. L’interfaccia utente della classe TermsViewControllerStoryboard
è definita in Main.storyboard. Possiamo istanziare un’istanza della classe invocando il metodo instantiate()
del protocollo Storyboardable
.
L’interfaccia utente della classe TermsViewControllerXIB
è definita in TermsViewControllerXIB.xib. La classe TermsViewControllerXIB
definisce una proprietà statica e variabile, nibName
, per evitare l’uso di letterali di stringa. Questo è simile alla proprietà storyboardIdentifier
definita in Storyboardable.swift.
Come implica il nome, la classe TermsViewControllerCode
non ha un collegamento a uno storyboard o a un file XIB. L’interfaccia utente è creata nel codice. Questo ovviamente comporta un bel po’ di codice in più. Diamo un’occhiata a ciascuno di questi controller di visualizzazione ed esploriamo come si inseriscono nel pattern coordinatore.
Storyboard
Gli storyboard esistono da diversi anni e Apple incoraggia gli sviluppatori ad usarli. Io uso gli storyboard nella maggior parte dei progetti su cui lavoro. Xcode crea automaticamente uno storyboard quando si crea un nuovo progetto, ma consiglio vivamente di usare diversi storyboard più piccoli invece di uno grande. Usando diversi storyboard più piccoli, si possono evitare più facilmente i conflitti di fusione e lavorare con storyboard più piccoli è più veloce e meno complesso.
Le sequenze sono una caratteristica chiave degli storyboard, ma non le uso mai in combinazione con il pattern coordinator. Mentre è possibile usare i segues in combinazione con il coordinator pattern, un segue coinvolge il view controller nel flusso dell’applicazione e questo è qualcosa che vogliamo evitare. Ricordate che i coordinatori del progetto gestiscono il flusso dell’applicazione. Un view controller non ha bisogno di sapere nulla del flusso dell’applicazione e non ha bisogno di sapere di altri view controller.
Anche senza seguiti, gli storyboard hanno il loro valore. Io divido sempre progetti medio-grandi in moduli. Ogni modulo ha uno storyboard, che contiene i view controller del modulo.
Apro TermsCoordinator.swift e passo al metodo showTerms()
. L’implementazione è identica a quella del progetto finito dell’episodio precedente. L’unica differenza è il nome della classe del view controller. Il coordinatore di termini istanzia la classe TermsViewControllerStoryboard
invece della classe 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)}
XIB
I file XIB esistono fin dai primi giorni dello sviluppo di Cocoa. Mancano di alcune caratteristiche rispetto agli storyboard, ma hanno ancora il loro valore. Io uso principalmente gli XIB per i componenti riutilizzabili, come le celle della vista tabella e le celle della vista collezione.
Apri terminiViewControllerXIB.xib. L’interfaccia utente della classe TermsViewControllerXIB
è identica a quella della classe TermsViewControllerStoryboard
in Main.storyboard. Aprite TermsCoordinator.swift e rivisitate il metodo showTerms()
. Per creare un’istanza della classe TermsViewControllerXIB
, invochiamo l’inizializzatore init(nibName:bundle:)
, passando il nome del file XIB e un riferimento al bundle che contiene il file 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
È anche possibile creare l’interfaccia utente dei view controller del progetto nel codice. Se non vi piacciono gli storyboard o i file XIB, allora questa è la vostra unica opzione. Non ho usato molto questa opzione dall’introduzione degli storyboard, ma può essere utile di tanto in tanto.
Creare e inizializzare un view controller nel codice è utile se quel view controller ha un’interfaccia utente complessa o dinamica. Creare e inizializzare i controllori di vista nel codice ha un altro vantaggio convincente. Permette l’injection dell’inizializzatore, una forma di dependency injection. Discuterò l’iniezione di dipendenza nel prossimo episodio.
Per creare un’istanza della classe TermsViewControllerCode
, invochiamo l’inizializzatore init()
. Questo equivale a invocare l’inizializzatore init(nibName:bundle:)
e passare in nil
per entrambi gli argomenti.
// 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)}
Che succede?
Il pattern coordinatore è un pattern flessibile. Non importa se usate storyboard, file XIB, o nessuno dei due. Puoi usare le sequenze, ma ricorda che stai violando un principio fondamentale del pattern coordinatore se lo fai. Un view controller non ha bisogno di conoscere il flusso dell’applicazione e non dovrebbe conoscere gli altri view controller.