O manual em falta
Para um desenvolvimento rápido
O guia que gostaria de ter quando comecei
Join 20,000+ Desenvolvedores Aprendendo Sobre Desenvolvimento Swift
Baixe sua cópia gratuita
O projeto Photos usa exclusivamente storyboards para desenhar e criar controladores de visualização. Neste episódio, eu mostro que o padrão do coordenador não está limitado a storyboards. Você também pode usar o padrão coordenador se preferir arquivos XIB em vez de storyboards. Se preferir não usar nenhum dos dois, então isso também é possível. Não importa como você projeta e cria os controladores de visualização do seu projeto.
Starter Project
O projeto inicial deste episódio é funcionalmente idêntico ao projeto final do episódio anterior. Há algumas diferenças que eu quero apontar, no entanto. A classe TermsViewController
já não está em conformidade com o protocolo Storyboardable
e agora tem três subclasses, TermsViewControllerStoryboard
, TermsViewControllerXIB
, e TermsViewControllerCode
.
A classe TermsViewControllerStoryboard
é idêntica à classe TermsViewController
do episódio anterior. A interface do usuário da classe TermsViewControllerStoryboard
é definida no Main.storyboard. Podemos instanciar uma instância da classe invocando o método instantiate()
do Storyboardable
protocol.
A interface do usuário da classe TermsViewControllerXIB
está definida em TermsViewControllerXIB.xib. A classe TermsViewControllerXIB
define uma propriedade estática, variável, nibName
, para evitar o uso de literais de string. Esta é similar à propriedade storyboardIdentifier
definida em Storyboardable.swift.
Como o nome implica, a classe TermsViewControllerCode
não tem um link para um storyboard ou para um arquivo XIB. A interface do usuário é criada em código. Isto obviamente resulta em um pouco mais de código. Vamos dar uma olhada em cada um desses controladores de visualização e explorar como eles se encaixam no padrão coordenador.
Storyboards
Storyboards já existem há vários anos e a Apple encoraja os desenvolvedores a usá-los. Eu uso storyboards na maioria dos projetos em que trabalho. Xcode cria automaticamente um storyboard quando você cria um projeto novo, mas eu recomendo fortemente que você use vários storyboards menores ao invés de um storyboard grande. Ao utilizar vários storyboards menores, você pode evitar conflitos de fusão mais facilmente e trabalhar com storyboards menores é mais rápido e menos complexo.
Segues são uma característica chave dos storyboards, mas eu nunca os utilizo em combinação com o padrão do coordenador. Enquanto é possível usar seguimentos em combinação com o padrão coordenador, um seguimento envolve o controlador de visualização no fluxo da aplicação e isso é algo que queremos evitar. Lembre-se que os coordenadores do projeto lidam com o fluxo da aplicação. Um view controller não precisa saber nada sobre o fluxo da aplicação e não precisa saber sobre outros view controllers.
Even sem segues, os storyboards têm seu valor. Eu sempre divido projetos de médio a grande porte em módulos. Cada módulo tem um storyboard, que contém os controladores de visualização do módulo.
Open TermsCoordinator.swift e navego para o método showTerms()
. A implementação é idêntica à do projeto terminado do episódio anterior. A única diferença é o nome da classe view controller. O termo coordenador instancia a classe TermsViewControllerStoryboard
em vez da classe TermsViewController
class.
// 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
XIBs existem desde os primeiros dias do desenvolvimento do Cocoa. Eles não têm algumas características em comparação com storyboards, mas ainda têm o seu valor. Eu uso principalmente XIBs para componentes reutilizáveis, tais como células de visão de tabela e células de visão de coleção.
Termos AbertosViewControllerXIB.xib. A interface do usuário da classe TermsViewControllerXIB
é idêntica à da classe TermsViewControllerStoryboard
no Main.storyboard. Abra o TermsCoordinator.swift e revisite o método showTerms()
. Para criar uma instância da classe TermsViewControllerXIB
, invocamos o inicializador init(nibName:bundle:)
, passando no nome do arquivo XIB e uma referência ao pacote contendo o arquivo 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
Também é possível criar a interface do usuário dos controladores de visualização do projeto em código. Se você não gosta de storyboards ou arquivos XIB, então esta é a sua única opção. Não tenho usado muito esta opção desde a introdução dos storyboards, mas pode ser útil de tempos em tempos.
Criar e inicializar um controlador de visualização em código é útil se esse controlador de visualização tiver uma interface de usuário complexa ou dinâmica. Criar e inicializar controladores de visualização em código tem outro benefício interessante. Ele permite a injeção do inicializador, uma forma de injeção de dependência. Eu discuto a injeção de dependência no próximo episódio.
Para criar uma instância da classe TermsViewControllerCode
, invocamos o init()
initializer. Isto é equivalente a invocar o init(nibName:bundle:)
initializer e passar em nil
para ambos os 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)}
What’s Next?
O padrão coordenador é um padrão flexível. Não importa se você usa storyboards, arquivos XIB, ou nenhum dos dois. Você pode usar seguimentos, mas lembre-se que você está violando um princípio fundamental do padrão coordenador se você o fizer. Um view controller não precisa saber sobre o fluxo da aplicação e não deve saber sobre outros view controllers.