首页 > 解决方案 > 无法使用 ViewModel 加载数据

问题描述

这是我的视图模型

class StatusCodeViewModel {

    let apiClient = APIClient.shared
    var statusCodes: [StatusCode] = []
    let identifier = "statusCodeCell"

    init() {}


    func loadStatusCodes() {
        apiClient.execute(service: .statusCode) { statusCodes in
            self.statusCodes = statusCodes
        }
    }

}

以及我要在其中加载数据的viewController

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    var viewModel: StatusCodeViewModel? {
        didSet {
            if viewModel!.statusCodes.count > 0 {
                self.tableView.reloadData()
            }
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel = StatusCodeViewModel()
        viewModel!.loadStatusCodes()
    }
}

extension ViewController : UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let statusCodes = viewModel!.statusCodes as? [StatusCode] {
            return statusCodes.count
        }
        return 0
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: viewModel!.identifier)
        cell?.textLabel!.text = viewModel!.statusCodes[indexPath.row].title
        return cell!
    }


}

数据计数为 0,tableView 中没有显示数据

标签: swiftmvvmtableviewviewmodel

解决方案


//这样就可以了!

     func loadStatusCodes(completion: @escaping () -> Void) {
               apiClient.execute(service: .statusCode) { statusCodes in
                   self.statusCodes = statusCodes
                   completion()
               }
           }
           

// 在 ViewController 中:

               override func viewDidLoad() {
                       super.viewDidLoad()
                       viewModel = StatusCodeViewModel()
                       viewModel?.loadStatusCodes() {
                           self.tableView.reloadData()
                       }
                   }

推荐阅读