使用 Swift 的 UITableView 和 MVVM

2023-12-23

我正在尝试MVVM架构在斯威夫特与UITableView。为此,我创建了示例表视图。

任何人都可以建议我是否正确或需要做任何其他改进吗?

以下是该架构的类。

  1. 视图控制器- 包含UITableView和它的delegate and 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
        }
    }
    
  2. 产品视图型号:- 这是 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. 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
        }
    }
    
  4. 产品表ViewCell- 这是 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)"

}

}

Usage:

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
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Swift 的 UITableView 和 MVVM 的相关文章

随机推荐

  • 共享元素转换(前台/后台)问题

    我想知道是否可以更改共享元素过渡的 z 顺序 看 我有一个带有图像的布局 它填满整个屏幕 图像前面是一个文本框 显示图像的标题 如果我单击文本框 则会开始过渡到详细信息活动 因此 我实现了一个共享元素过渡 其中全屏图像在详细视图中动画化为自
  • Python 虚拟环境最终会使用比创建它的版本更旧的 PIP...为什么以及如何解决此版本控制问题?

    我的问题与另一个被问到的问题类似Python3 https stackoverflow com questions 29689514 why python3 m venv myenv installs older version of pi
  • 如何实施混凝土红青浮雕眼镜显示器的红色和青色校准程序?

    我正在开发一个用于治疗儿童的应用程序 它必须为左眼和右眼显示不同的图像 我决定使用廉价的红青色眼镜来分离眼睛的视野 第一只眼睛只能看到红色图像 第二只眼睛只能看到青色图像 问题是显示器上的颜色并不是真正的红色和青色 而且眼镜也不是理想的 我
  • 线程中的 Stop() 方法?

    在下面的例子中如何stop 方法实现了 应该做什么而不是使用stop method 在我看来 当所需的状态被挂起时 线程等待使用Object wait 当线程恢复时 会使用以下命令通知目标线程Object notify 但在实施的情况下值得
  • 在 Rails 中创建帐户时创建随机、唯一的令牌

    我有一个使用 Devise 最新的 的 Rails 4 应用程序 并尝试为每个用户创建一个随机令牌 如 ID 但更长等 使用this https stackoverflow com questions 6021372 best way to
  • pandas 具有相同索引的两个数据帧的外积

    考虑以下数据框d1 and d1 d1 pd DataFrame 1 2 3 2 3 4 3 4 5 1 2 3 2 3 4 3 4 5 columns list ABC d2 pd get dummies list XYZZXY d1 A
  • 如何在 JavaScript 中将字符串中所有出现的“/”替换为“_”?

    由于某种原因 replace 方法仅替换第一个出现的位置 而不替换其他出现的位置 有任何想法吗 你必须使用g替换调用中的修饰符 用于全局 str str replace searchString g replaceWith 在您的具体情况下
  • NSAttributedString 将样式更改为粗体而不更改 pointSize?

    我正在深入研究NSAttributedString在 iOS 上 我有一个模型 返回一个人的名字和姓氏NSAttributesString 我不知道在模型中处理属性字符串是否是一个好主意 我希望以常规方式打印名字 而姓氏应以粗体打印 我不想
  • 休假、加入、输入 vue.js 时是否有回调?

    About 我正在用 Laravel 学习 Vue js 目前 正在练习在 2 个用户之间发送实时短信 下面的代码向另一个用户发送消息 var url http localhost 6001 apps My appId events aut
  • 反应本机Android应用程序从谷歌电子表格获取和显示数据

    我在谷歌电子表格中存储一些数据 例如 温度 所以现在我想从我的谷歌电子表格中获取数据并将其显示在我的 React Native Android 应用程序中 有人可以给我一些想法或例子吗 如果您的数据是公开的 1 发布文件 文件菜单 发布 更
  • Turbo C++ 的字符串问题

    我需要在 Turbo C 中进行代码工作 但数据类型string不起作用 使用命名空间std给出编译器错误 我无法使用string没有它 甚至std string不起作用 它在 Code Blocks 中工作得很好 但我希望它在 Turbo
  • PHP - 上传多个文件

    我正在开发一个 WordPress 插件 我希望能够从表单上传多张图片 现在 当我有两张图片的表单并将其提交为空时 我的 FILES 数组如下所示 Array image gt Array name gt Array 1 gt 2 gt t
  • 计算 MySQL 中父子模型的深度

    MySQL下父子模型如何计算节点深度 我需要深度 除其他外 在我的列表中创建缩进 用 PHP 编码 这取决于数据库中层次结构的实际实现 如果您使用嵌套集模型 http mikehillyer com articles managing hi
  • MongoDB - MySQL SUM(何时)等效?

    我正在尝试使用 Mongo 进行一些测试 我已经找到了一些与 Mongo 等效的更简单的 MySQL 查询 我的查询有点复杂 我需要帮助 SELECT DISTINCT dims user COUNT DISTINCT asset name
  • FlatBuffers 有大小限制吗?

    我可以在 FlatBuffer 中存储 100GB 的字符串吗 10 TB 2023 年您可以购买服务器拥有更多的内存 https www google com search q your data fits in ram 它是否仅受我的服
  • “var foo = function bar (){ ... }”中“bar”的用途是什么?

    在 Douglas Crockford 的书中 他将递归函数写为 var walk the DOM function walk node func func node node node firstChild while node walk
  • 如何在 WordPress 上正确包含 jquery-ui 效果

    我一直在尝试在我的 WordPress 主题中包含 jquery ui 效果 更具体地说是抖动效果 到目前为止 我只能包含 jQuery 脚本 但我真的不知道在哪里放置 ui 脚本以及如何将它们排入队列 这是我的代码 它显然不起作用
  • 带日期轴的javafx折线图

    我正在尝试在 JavaFX 中创建折线图 该折线图应具有一个带数字的轴 y 和另一个带日期的轴 x 日期范围应由用户使用两个日期选择器来选择 现在这是我的问题 折线图只有类别和数字轴 有没有办法将日期整合到图表中 我遇到了同样的问题 唯一的
  • Django、Angular 和 DRF:Django 后端与 API 的身份验证

    我正在构建一个具有 Django 后端 Angular 前端和 REST API 的应用程序 使用 Django REST Framework 供 Angular 使用 当我仍在使用普通前端开发后端内容时 我使用提供的 Django 身份验
  • 使用 Swift 的 UITableView 和 MVVM

    我正在尝试MVVM架构在斯威夫特与UITableView 为此 我创建了示例表视图 任何人都可以建议我是否正确或需要做任何其他改进吗 以下是该架构的类 视图控制器 包含UITableView和它的delegate and datasourc