рд╢реБрд░реБрдЖрддреА рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд MVC

рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд░рд┐рдЪрдп


рд╕рднреА 404! рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдРрдкреНрдкрд▓-рдПрдорд╡реАрд╕реА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрдЪрд┐рдд рдЖрд▓реЛрдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рдЫреЛрдЯреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИрдВ, ViewControllers рд╡рд┐рд╢рд╛рд▓, рдЕрдкрдардиреАрдп рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ , рдЕрдкрдиреЗ рд▓рд┐рдП рдЬреАрд╡рди, рдЬрд┐рд╕рдиреЗ 3 рдорд╣реАрдиреЗ рдХреЗ рдмрд╛рдж рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рднреА ViewControllers рдХреЗ рд▓рд┐рдПред рдпрд╣ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ? рд╢реБрд░реБрдЖрддреА рдпрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЬреЛ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рд╕реБрдВрджрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИрдВред

рд╣рд░ рдХреЛрдИ рдХрд╣рд╛рдБ рдбреВрдмрддрд╛ рд╣реИ?


рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╕рднреА рдХреЗ рдкрд╕рдВрджреАрджрд╛ рдорд╛рдирдХ рд╕реБрдВрджрд░ MVC рдХреЛ рджреЗрдЦреЗрдВред

рдЫрд╡рд┐

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдмрд╣реБрдордд рд╕реЗ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдЫрд╡рд┐

рдардВрдбрд╛? рдирд╣реАрдВ! рдЗрд╕рд▓рд┐рдП, рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред

рд╕реМрдВрджрд░реНрдп рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ


рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдЧрд▓ рд╡реНрдпреВ рдРрдк рдмрдирд╛рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рднрд╛рд╖рд╛ рдЪрдпрди рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдХреЛ рд░рдЦрд╛, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рднреА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ: рди рддреЛ рдкрд░реАрдХреНрд╖рдг, рди рд╣реА рдХреЛрд░рдбреИрдЯред

рдореИрдВ рдПрдХ рджреБрдХрд╛рди рдЦрд┐рдбрд╝рдХреА рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдПрдорд╡реАрд╕реА рдХреЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЗрдВрдЧреЗред

рдареАрдХ рд╣реИ, рдПрдХ рдХрд╛рд░реНрдп рд╣реИ, рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реБрдП, рдореИрдВ рд╕рдм рдХреБрдЫ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЦрд╛рд▓реА рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд╣рд╛рдВ рдЭреВрда рдмреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рд╕рдВрд░рдЪрдирд╛ рд╕рдВрд▓рдЧреНрди рдХреА рдЧрдИ рд╣реИ, рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рд╣реЛред рд╕реЗрд▓ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдЖрдИрдбреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ , рдореИрдВрдиреЗ ProductCell рд▓рд┐рдЦрд╛ред

рдЫрд╡рд┐

рдЦреВрдмрд╕реВрд░рдд? рдмреЗрд╢рдХ рдпрд╣ рд╕реБрдВрджрд░ рд╣реИред рд╣рдо рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ ...

рдХреБрдЫ рдореИрдЬрд┐рдХ рд╕реНрд╡рд┐рдлреНрдЯ


рдЕрдм рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рджреГрд╢реНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рд╣рдореЗрдВ рд╕рднреА IBOutlets, рдФрд░ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

//    ,   view     UIKit. 
import UIKit

class ShopView: UIView{
    //       storyboard. 
    @IBOutlet weak var tableView: UITableView!
    //      view. 
    func configure(){
        //     ,    ,      ...
        tableView.estimatedRowHeight = 50
        tableView.rowHeight = 100
    }
}

рдпрд╣ рд╣рдорд╛рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреИрд╕рд╛ рд╣реЛрдЧрд╛, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдореИрдВ рд╕рд┐рд░реНрдл рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмрдЯрди рдХреЗ рд╢реАрд░реНрд╖рдХ рдХреЗ рд╢реАрд░реНрд╖рдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрджрд┐ ... рддреЛ рдЖрджрд┐рдо рд░реВрдк рд╕реЗ рдХрд╣реЗрдВ? рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕ рд▓рд╛рдн рдХрд╛ рдЗрддрдирд╛ рдХрдо рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?! рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ: view.hideBorders (рд╕реНрд╡рдпрдВ) рдФрд░ рдпрд╣ рд╡рд╣ рд╣реИ, рдФрд░ рджреГрд╢реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реБрдВрджрд░ рдПрдиреАрдореЗрд╢рди рдмрдирд╛ рджреЗрдЧрд╛ред

//    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)
}

рдЖрдЧ! рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд╡рд╛рдкрд╕, рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордпред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рд▓ рд╣реЛрдЧрд╛, рдФрд░ рдЙрдирдХреЗ рд╕рдореВрд╣ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

//   ,   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: "")
    }
}

рдорд╣рд╛рди, рд╣рдорд╛рд░рд╛ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рд╣реИ, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЖрдЗрдП рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрдкрдиреА рджреЛ рдореБрдЦреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ, рдореЙрдбрд▓ рдФрд░ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдлрд┐рд░ рдореИрдВ рдирд┐рдЬреА рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реВрдВрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдореЙрдбрд▓ рд╕реЗ рд╣рдорд╛рд░реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред

//  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!
    }
}

рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛, рднреВрд▓ рдЧрдП?) рд╣рдорд╛рд░реА рд╢реЙрдк рд╡реНрдпреВ рдПрдХ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рджреМрд░рд╛рди рджреГрд╢реНрдп рдХреЛ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рди рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рджреГрд╢реНрдпрджрд░реНрд╢реА рд╣реИред рдпрджрд┐ рджреГрд╢реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рд╣реИ, рддреЛ рд╣рдо рдЙрд╕реЗ ShopView рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдмрд╛рдд рд╣реИ, рд╣рдорд╛рд░рд╛ рдкрд░рдорд╡реАрд░ рдЪрдХреНрд░ рддреИрдпрд╛рд░ рд╣реИ! рдпрд╣ рдХрдорд╛рдВрдб + R рдкреНрд░реЗрд╕ рдХрд░рдиреЗ рдФрд░ рддреАрди рд╕реЗрд▓ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

рдЖрдЦрд┐рд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?


  • рд╕рд░рд▓, рд╕реНрдкрд╖реНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
  • рдореЙрдбрд▓, рджреГрд╢реНрдп, рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд╕рдорд╛рди рднрд╛рд░
  • рдЖрд╕рд╛рди рдкреБрди: рдЙрдкрдпреЛрдЧ рджреГрд╢реНрдп
  • рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрд╕рд╛рди рд╡рд┐рд╕реНрддрд╛рд░рд╢реАрд▓рддрд╛

рдирд┐рд╖реНрдХрд░реНрд╖


рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╕рд╛рдл рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдХреЛрдб рдореЗрдВ рдЦреЛ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рднреА рдЕрдЪреНрдЫреЗ рдФрд░ рдХрдо рдмрдЧ ^ ^

All Articles