2017-07-20 19 views
3

私はMVVMアーキテクチャスイフトでUITableViewで作業しています。このために、私はサンプルテーブルビューを作成しました。Swiftを使用したMVVMを使用したUITableView

私が正しいかどうか、あるいは改善が必要かどうかをお聞かせください。

このアーキテクチャのクラスは次のとおりです。

  1. のViewControllerは - UITableViewとそのdelegatedatasourceメソッドが含まれています。

    class ViewController: UIViewController { 
        let PRODUCT_CELL_IDENTIFIER = "ProductCellIdentifier" 
    
        @IBOutlet weak var productTableView: UITableView! 
    
        var productViewModel: ProductViewModel = ProductViewModel() 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
         // Do any additional setup after loading the view, typically from a nib. 
        } 
    
        override func didReceiveMemoryWarning() { 
         super.didReceiveMemoryWarning() 
         // Dispose of any resources that can be recreated. 
        } 
    } 
    
    //UITableView Delegate Methods 
    extension ViewController { 
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
         return productViewModel.numberOfRowsInSection() 
        } 
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
         let cell = tableView.dequeueReusableCell(withIdentifier: PRODUCT_CELL_IDENTIFIER) as! ProductTableViewCell 
         let product = productViewModel.productsArray[indexPath.row] 
         cell.productName.text = product.name 
         cell.productQuantity.text = "\(product.quantity)" 
         return cell 
        } 
    } 
    
  2. ProductViewModel: - これはViewModelにクラスです。

    class ProductViewModel: NSObject { 
        var productsArray = Array<Product>() 
    
        override init() { 
         let product1 = Product(name: "Prodcut1", image_url: "", quantity: 2) 
         let product2 = Product(name: "Prodcut2", image_url: "", quantity: 3) 
         productsArray.append(product1) 
         productsArray.append(product2) 
        } 
    
        func numberOfRowsInSection() -> Int { 
         return productsArray.count 
        } 
    } 
    
  3. 製品 - これはProductTableViewCell

    class Product: NSObject { 
        var name: String 
        var image_url: String 
        var quantity: Int 
    
        init(name: String, image_url: String, quantity: Int) { 
         self.name = name 
         self.image_url = image_url 
         self.quantity = quantity 
        } 
    } 
    
  4. モデルクラスである - これは

    class ProductTableViewCell: UITableViewCell { 
        @IBOutlet weak var productQuantity: UILabel! 
        @IBOutlet weak var productName: UILabel! 
        @IBOutlet weak var productImageView: UIImageView! 
    } 
    
+0

あなたが良いやっています! – jegadeesh

+0

ありがとうございましたjegadeesh – Dhanunjaya

答えて

5

のUITableViewCellクラスであるあなたが良い仕事をしているが、あなたはc直接モデルの配列を取得するために、次の関数を追加して製品モデルをさらに改善します。これは、Web APIの応答から配列を作成したときに非常に便利です。

使用に
class Product : NSObject 
    { 

     var imgUrl : String! 
     var name : String! 
     var quantity : Int! 

     init(dictionary: [String:Any]) 
     { 
      imgUrl = dictionary["img_url"] as? String 
      name = dictionary["name"] as? String 
      quantity = dictionary["quantity"] as? Int 
     } 
     init(name: String, image_url: String, quantity: Int) 
     { 
     self.name = name 
     self.imgUrl = image_url 
     self.quantity = quantity 
     } 
     public class func modelsFromArray(array:[[String:Any]]) -> [Product] 
     { 
      var models:[Product] = [] 
      for item in array 
      { 
       models.append(Product.init(dictionary:item)) 
      } 
      return models 
     } 
    } 

let product1 = Product(name: "Prodcut1", image_url: "", quantity: 2) //Normal Case 

    let productList:[[String:Any]] = 
     [ 
     ["name":"Jaydeep","img_url":"xyz","quantity":1], 
     ["name":"Jaydeep","img_url":"xyz","quantity":2], 
     ["name":"Jaydeep","img_url":"xyz","quantity":3], 
     ["name":"Jaydeep","img_url":"xyz","quantity":4], 
     ["name":"Jaydeep","img_url":"xyz","quantity":5], 
     ["name":"Jaydeep","img_url":"xyz","quantity":6] 
     ] 
    //Assign Direct Dictionary to Get Array Of Models 
/* Very useful when productList is dictionary from server response*/ 
    let productArray:[Product] = Product.modelsFromArray(array: productList) 

好きで、また、あなたのセルクラスが

class ProductTableViewCell: UITableViewCell { 

@IBOutlet weak var productQuantity: UILabel! 
@IBOutlet weak var productName: UILabel! 
@IBOutlet weak var productImageView: UIImageView! 
func setProductData(product:Product) 
{ 
self.productName.text = product.name 
self.productQuantity.text = "\(product.quantity)" 

} 

} 

によって改善される使用方法:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: PRODUCT_CELL_IDENTIFIER) as! ProductTableViewCell 
    let product = productViewModel.productsArray[indexPath.row] 
    cell.setProductData(product:product) 
    return cell 
    } 
+0

ありがとう。 'modelsFromArray'メソッドの混乱の少し。 – Dhanunjaya

+0

okey混乱しているもの –

+0

2つのアレイを使用しています。 1つは使用中で、他は 'Product'モデルクラスです。 – Dhanunjaya

関連する問題