Pequena introdução
Todos 404! A maioria dos desenvolvedores de iOS não entende como trabalhar com o Apple-MVC. Por causa das quais existem críticas irracionais, pequenos projetos tentam escrever em arquiteturas que não são destinadas a isso, os ViewControllers se tornam enormes, ilegíveis e assim por diante.Neste artigo, mostrarei uma maneira simples de tornar a vida mais fácil para mim, vida para mim, que analisou o projeto após três meses e, é claro, para todos os ViewControllers. Para quem é adequado? Para iniciantes ou desenvolvedores com pequenos projetos que acabam com uma estrutura limpa e bonita.Onde todos se afogam?
Para começar, vejamos o belo MVC padrão favorito de todos.
Agora vamos ver o que está sendo implementado pela maioria.
Legal? Não! Portanto, não faremos isso, mas implementaremos a primeira opção.Fazendo a estrutura da beleza
Criamos o aplicativo Single View usual. Coloquei o Swift no campo de seleção de idioma, sem incluir mais nada: nem testes, nem CoreDat.Vou mostrar pelo exemplo da criação de uma vitrine, porque precisamos afetar todas as partes do MVC, levaremos os dados do modelo no controlador para distribuir e mostrar em exibição.Ok, há uma tarefa, há um projeto vazio. Agora, mergulhando no projeto, distribuirei tudo em pastas e crio arquivos vazios para que você entenda onde eles devem estar no futuro. Também anexou uma estrutura de storyboard, para não perder tempo no futuro. Não se esqueça de especificar o ID de reutilização na célula, escrevi ProductCell.
Generosamente? Claro que é lindo. Nós continuamos ...Alguma mágica rápida
Agora podemos começar a implementação. Vamos começar com uma visão simples. Precisamos criar todos os IBOutlets e as configurações para nossa visão.
import UIKit
class ShopView: UIView{
@IBOutlet weak var tableView: UITableView!
func configure(){
tableView.estimatedRowHeight = 50
tableView.rowHeight = 100
}
}
É assim que nossa visão será, na função configure () eu apenas defino as configurações, mas a visualização precisa ser usada para animações e para alterar o título do título do botão, etc. ... Então, diga de forma primitiva? Mas por que usar essa vantagem tão pouco ?! Então, por exemplo, eu uso animações no controller'e: view.hideBorders (self) e é isso, e o view já cria uma bela animação.
func hideBorders(view: UIView){
UIView.animate(withDuration: 0.3,
delay: 0,
options: .curveEaseInOut,
animations: {
self.createViewHeighConstraint.constant = view.bounds.height * 0.6
self.editButton.layer.cornerRadius = 20
self.postView.layer.shadowOpacity = 0
self.postView.layer.cornerRadius = 0
view.layoutIfNeeded()
}, completion: nil)
}
Fogo! Mas voltando ao nosso projeto, é hora de implementar o modelo. E assim teremos bens, e sejam seus grupos.
import Foundation
public struct Product {
public let name: String
}
public struct ProductGroup {
public let products: [Product]
public let title: String
}
extension ProductGroup{
public static func vegetables() -> ProductGroup{
let products = [
Product(name: ""),
Product(name: ""),
Product(name: "")
]
return ProductGroup(products: products, title: "")
}
}
Ótimo, nosso modelo está pronto, resta montar o controlador, vamos transgredir. Primeiro, precisamos criar duas de nossas principais entidades, modelo e visualização. Depois, retirarei as configurações do controlador na extensão privada e transferirei os dados do modelo para a nossa tabela.
import UIKit
class ShopController: UIViewController {
private var shopModel = ProductGroup.vegetables()
private var shopView: ShopView! {
guard isViewLoaded else { return nil }
return (view as! ShopView)
}
override func viewDidLoad() {
super.viewDidLoad()
configure()
}
}
private extension ShopController{
func configure(){
shopView.tableView.delegate = self
shopView.tableView.dataSource = self
}
}
extension ShopController: UITableViewDataSource, UITableViewDelegate{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return shopModel.products.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell")
cell?.textLabel?.text = shopModel.products[indexPath.row].name
return cell!
}
}
Ele prometeu explicar a vista, não se esqueceu?) Nosso shopView é uma propriedade calculada. Aqui, verificamos isViewLoaded para não fazer com que a exibição seja carregada acidentalmente ao acessar esta propriedade. Se a visualização já estiver carregada, forçamos que ela seja convertida em ShopView.É isso aí, o nosso mvc está pronto! Resta pressionar command + R e ver três células.O que temos no final?
- Arquitetura simples e clara
- Carga uniforme no modelo, vista, controlador
- Visualização de reutilização fácil
- Fácil extensibilidade do nosso projeto
Conclusão
Eu realmente espero que este artigo ajude os iniciantes a manterem seus projetos limpos, não se perderem no código, mas se concentrarem nas tarefas. Todos os bons e menos bugs ^^