Usamos um storyboard Main.storyboard para definir o fluxo do app, porém o desenvolvimento da tela não é feito diretamente no storyboard. Para desenvolver uma tela você deve:
- Criar um viewController para esta tela
- Criar uma view que extenda de NibDesignable
- Criar um Xib com o mesmo nome da View.
- Definir a classe do File's Owner para a classe da view que você criou
- Adicionar uma nova scene no storyboard.
- Definir a classe do ViewController para o controller criado no passo 1
- Arrastar uma nova View para dentro dele, e definir a classe dessa view para a view criada no passo 2
Com isso, a view será renderizada corretamente no storyboard, mas sua edição será no arquivo Xib criado.
Devemos seguir alguns conceitos e princípios para separar a lógica de nossa funcionalidade:
- O ViewController deve apenas interagir com a view quando esta tiver que mudar de tamanho, ou apresentar outros ViewControllers
- Crie uma classe que extenda de ViewModel.
- Adicione uma propriedade viewModel para a classe View.
- A classe ViewModel deve conter informações sobre o estado da view, e lógicas que alterem esses estados.
- A classe View deve monitorar estes estados para alterar visualmente sua aparência.
Para que a view consiga responder a mudanças de valores das propriedades do ViewModel, ao invés de declarar uma propriedade como:
var enabled = true
voce pode utilizar a classe Dynamic, e sua propriedade ficaria assim:
let enabled = Dynamic(true)
com isso voce pode adicionar listeners para quando esta propriedade mudar:
viewModel.enable.bind(self) { enabled in
//your code here
}
Para acessar o valor atual de enabled, utilize a propriedade value:
if viewModel.enable.value {
}
A classe Dynamic possui dois métodos para fazer esse bind: bind e bindAndFire
- bind vai apenas escutar por novas mudanças de valores
- bindAndFire vai executar o bloco com o valor atual e escutar por mudanças de valores