【问题标题】:Swift 5: How to add dependency injection to a programmatic UITableviewCellSwift 5:如何将依赖注入添加到程序化 UITableviewCell
【发布时间】:2022-01-05 21:15:17
【问题描述】:

我想将我的 viewmodel 添加到我的 CustomTableViewCell,然后能够将我在 viewmodel 中的数据与我的 func configure() 绑定,但是当我尝试时,我在 override init "Property' 中遇到错误self.viewModel' 未在 super.init 调用中初始化”。 我尝试创建另一个 init,但我收到另一个错误“必须调用超类 'UITableViewCell' 的指定初始化程序”

这是我的代码:

final class CustomTableViewCell: UITableViewCell {
    
    // MARK: - Properties

    private let returnAmount = UILabel.subtitle()
    private let margin: CGFloat = 15
    static let identifier = "CustomTableViewCell"
    static let rowHeigh: CGFloat = 175
    
    var viewModel: TableViewCellViewModel
    
    // MARK: - Init
    
    init(viewModel: DetailViewModel) {
        self.viewModel = viewModel
    }
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        contentView.backgroundColor = UIColor.clear
        backgroundColor = UIColor.clear

        setupViews()
    }
    
    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - Configure View
    func configure(){
        returnAmount.text = viewModel.returnAmount
    }

查看模型:

import Foundation

class TableViewCellViewModel {

    private let data: Contacts?
    
    init(data: Contacts) {
        self.data = data
    }
    
    var returnAmount: String {
        let amount = data?.returnAmount ?? 0
        return amount.formatThousandsAndDecimal(intValue: amount)
    }

在这些情况下我该如何解决?

【问题讨论】:

    标签: ios swift uitableview mvvm dependency-injection


    【解决方案1】:

    当单元格初始化时,ViewModel 未初始化,您稍后再分配它。你必须告诉运行时间

    • 此属性将在需要时具有值 (!)

    或者

    • 该属性初始化为 nil,以后可能有值 (?)

    所以使用任何一个

    var viewModel: TableViewCellViewModel!
    

    或者

    var viewModel: TableViewCellViewModel?
    

    然后在configure函数中设置VM

    func configure(_ vm: TableViewCellViewModel) {}
    

    一般来说,在初始化时将属性注入 Cell 并不容易,因为您没有控制 Cell 生命周期

    【讨论】:

    • 对@CloudBalancing 的回答更进一步,表格视图单元格通常会初始化一次,但会针对不同的行多次重复使用,因此通过初始化程序注入数据并不是特别有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多