Skip to content
Menu
CDhistory
CDhistory

Storyboard, XIB e codice

Posted on Settembre 6, 2021 by admin
Risorse

Scarica la tua copia gratuita di
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
  • Storyboard
  • XIB
  • Code
  • Che succede?

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.

Lascia un commento Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Articoli recenti

  • Acela è tornato: NYC o Boston per $99
  • I genitori di Kate Albrecht – Per saperne di più sul padre Chris Albrecht e la madre Annie Albrecht
  • Temple Fork Outfitters
  • Burr (romanzo)
  • Trek Madone SLR 9 Disc

Archivi

  • Febbraio 2022
  • Gennaio 2022
  • Dicembre 2021
  • Novembre 2021
  • Ottobre 2021
  • Settembre 2021
  • Agosto 2021
  • Luglio 2021
  • Giugno 2021
  • Maggio 2021
  • Aprile 2021
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語
©2022 CDhistory | Powered by WordPress & Superb Themes