El manual que falta
para el desarrollo de Swift
La guía que desearía haber tenido cuando empecé
Únete a más de 20,000+ Desarrolladores que aprenden sobre el desarrollo Swift
Descarga tu copia gratuita
El proyecto Photos utiliza exclusivamente storyboards para diseñar y crear controladores de vista. En este episodio, te muestro que el patrón coordinador no se limita a los storyboards. También puedes utilizar el patrón coordinador si prefieres los archivos XIB en lugar de los storyboards. Si prefieres no usar ninguno de los dos, también es posible. No importa cómo diseñes y crees los controladores de vista de tu proyecto.
Proyecto de inicio
El proyecto de inicio de este episodio es funcionalmente idéntico al proyecto terminado del episodio anterior. Sin embargo, hay algunas diferencias que quiero señalar. La clase TermsViewController
ya no se ajusta al protocolo Storyboardable
y ahora tiene tres subclases, TermsViewControllerStoryboard
, TermsViewControllerXIB
y TermsViewControllerCode
.
La clase TermsViewControllerStoryboard
es idéntica a la clase TermsViewController
del episodio anterior. La interfaz de usuario de la clase TermsViewControllerStoryboard
se define en Main.storyboard. Podemos instanciar una instancia de la clase invocando el método instantiate()
del protocolo Storyboardable
.
La interfaz de usuario de la clase TermsViewControllerXIB
se define en TermsViewControllerXIB.xib. La clase TermsViewControllerXIB
define una propiedad estática y variable, nibName
, para evitar el uso de literales de cadena. Esto es similar a la propiedad storyboardIdentifier
definida en Storyboardable.swift.
Como su nombre indica, la clase TermsViewControllerCode
no tiene un enlace a un storyboard o un archivo XIB. La interfaz de usuario se crea en el código. Esto obviamente resulta en un poco más de código. Echemos un vistazo a cada uno de estos controladores de vista y exploremos cómo encajan en el patrón de coordinador.
Tarjetas de historia
Las tablas de historia han existido durante varios años y Apple anima a los desarrolladores a usarlas. Yo uso storyboards en la mayoría de los proyectos en los que trabajo. Xcode crea automáticamente un guión gráfico cuando se crea un nuevo proyecto, pero recomiendo encarecidamente utilizar varios guiones gráficos más pequeños en lugar de un gran guión gráfico. Al usar varios storyboards más pequeños, puedes evitar conflictos de fusión más fácilmente y trabajar con storyboards más pequeños es más rápido y menos complejo.
Los segues son una característica clave de los storyboards, pero nunca los uso en combinación con el patrón de coordinador. Si bien es posible utilizar segues en combinación con el patrón coordinador, un segue involucra al controlador de la vista en el flujo de la aplicación y eso es algo que queremos evitar. Recuerda que los coordinadores del proyecto manejan el flujo de la aplicación. Un controlador de vista no necesita saber nada sobre el flujo de la aplicación y no necesita saber sobre otros controladores de vista.
Incluso sin segues, los storyboards tienen su valor. Yo siempre divido los proyectos medianos y grandes en módulos. Cada módulo tiene un storyboard, que contiene los controladores de vista del módulo.
Abre TermsCoordinator.swift y navega hasta el método showTerms()
. La implementación es idéntica a la del proyecto terminado del episodio anterior. La única diferencia es el nombre de la clase del controlador de vista. El coordinador de términos instancia la clase TermsViewControllerStoryboard
en lugar de la clase 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
Los archivos XIB han existido desde los primeros días del desarrollo de Cocoa. Carecen de algunas características en comparación con los storyboards, pero todavía tienen su valor. Yo uso principalmente XIBs para componentes reutilizables, tales como celdas de vista de tabla y celdas de vista de colección.
Abrir TermsViewControllerXIB.xib. La interfaz de usuario de la clase TermsViewControllerXIB
es idéntica a la de la clase TermsViewControllerStoryboard
en Main.storyboard. Abra TermsCoordinator.swift y revise el método showTerms()
. Para crear una instancia de la clase TermsViewControllerXIB
, invocamos el inicializador init(nibName:bundle:)
, pasando el nombre del archivo XIB y una referencia al bundle que contiene el archivo 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)}
Código
También es posible crear la interfaz de usuario de los controladores de vista del proyecto en código. Si no te gustan los storyboards o los archivos XIB, esta es tu única opción. No he utilizado mucho esta opción desde la introducción de los storyboards, pero puede ser útil de vez en cuando.
Crear e inicializar un controlador de vista en código es útil si ese controlador de vista tiene una interfaz de usuario compleja o dinámica. Crear e inicializar los controladores de vista en el código tiene otro beneficio convincente. Permite la inyección de inicializadores, una forma de inyección de dependencias. Discutiré la inyección de dependencia en el próximo episodio.
Para crear una instancia de la clase TermsViewControllerCode
, invocamos el inicializador init()
. Esto es equivalente a invocar el inicializador init(nibName:bundle:)
y pasar nil
para ambos argumentos.
// 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)}
¿Qué sigue?
El patrón coordinador es un patrón flexible. No importa si usas storyboards, archivos XIB, o ninguno de los dos. Puedes usar segues, pero recuerda que estás violando un principio fundamental del patrón coordinador si lo haces. Un controlador de vista no necesita saber sobre el flujo de la aplicación y no debería saber sobre otros controladores de vista.