我正在使用 UITableView
在 Swift 中研究 MVVM 架构。为此,我创建了示例 TableView 。
任何人都可以建议我是否正确或需要做任何其他改进吗?
以下是该架构的类。
ViewController - 包含
UITableView
及其delegate
和datasource
方法。class ViewController: UIViewController { let PRODUCT_CELL_IDENTIFIER = "ProductCellIdentifier" @IBOutlet weak var productTableView: UITableView! var productViewModel: ProductViewModel = ProductViewModel() } //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 } }
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 } }
Product - 这是模型类
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 } }
ProductTableViewCell - 这是 UITableViewCell 类
class ProductTableViewCell: UITableViewCell { @IBOutlet weak var productQuantity: UILabel! @IBOutlet weak var productName: UILabel! @IBOutlet weak var productImageView: UIImageView! }
最佳答案
你做得很好,但你甚至可以通过添加以下函数来改进你的产品模型以获得直接模型数组。当您从 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
}
关于ios - 使用 Swift 的带有 MVVM 的 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45206153/