MVC adequado para iniciantes e muito mais

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.

imagem

Agora vamos ver o que está sendo implementado pela maioria.

imagem

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.

imagem

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.

//    ,   view     UIKit. 
import UIKit

class ShopView: UIView{
    //       storyboard. 
    @IBOutlet weak var tableView: UITableView!
    //      view. 
    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.

//    view  . 
func hideBorders(view: UIView){
    UIView.animate(withDuration: 0.3,
                   delay: 0,
                   options: .curveEaseInOut,
                   animations: {
           //         constraint. 
           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.

//   ,   model       View.
// ,    ,       Foundation.
import Foundation
//      ,  . 
public struct Product {
  public let name: String
}
//    ,      ,   . 
public struct ProductGroup {
  public let products: [Product]
  public let title: String
}
//  swift   ()    extension. 
extension ProductGroup{
    //  ,     ( Product). 
    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.

//  controller'e      ,      UIKit.
import UIKit

class ShopController: UIViewController {
    //  -     .
    private var shopModel = ProductGroup.vegetables()
    
    //     (       )
    private var shopView: ShopView! {
        guard isViewLoaded else { return nil }
        return (view as! ShopView)
    }
    //      view,         controller'a  view  . 
    override func viewDidLoad() {
        super.viewDidLoad()
        //    view      .
        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 {
        //   ,   reuse Id ,      .
        let cell = tableView.dequeueReusableCell(withIdentifier: "ProductCell")
        //    label  cell     . 
        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 ^^

All Articles