swift - 无法使用 ViewModel 加载数据
问题描述
- tableView 数据源在 IB 中正确设置
- viewController 身份也在 IB 中正确设置
这是我的视图模型
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 中没有显示数据
解决方案
//这样就可以了!
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()
}
}
推荐阅读
- javascript - 插入自定义 HTML 字段值并在 PHP 中访问它
- php - 将整张桌子传递给刀片
- ruby-on-rails - 如何使用 ActiveAdmin 仅在显示视图中显示编辑链接
- sql - 对于具有给定值的行,仅返回在 Col B 中未找到 Col A 值的行
- python - 模型如何具有多个具有相同模型类型的键作为值?
- javascript - 根据 React 页面中的行数据更改 scss 中的颜色
- vue.js - VueJs,如果选中复选框,则发送到方法
- python - 求解方程组:matlab中的2个微分,1个二次
- python - 在 Pandas 中获取今天的日期
- php - 从 pdf / a 中提取文本