gpt4 book ai didi

swift - 无法使用 ViewModel 加载数据

转载 作者:行者123 更新时间:2023-11-30 11:27:30 25 4
gpt4 key购买 nike

  • tableView 数据源已在 IB 中正确设置
  • viewController 身份也在 IB 中正确设置

这是我的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中没有显示数据

最佳答案

您已经设置了 View 模型,这将在初始化时发生。

当 api 返回调用时,您必须实现某种回调 - 最简单的方法是协议(protocol)。

protocol StatusCodeViewModelDelegate {
func callFinished()
}

class StatusCodeViewModel {

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

init() {}


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

}

然后在你的viewController中:

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

func callFinished() {
self.tableView.reloadData()
}

不要忘记延长您刚刚创建的委托(delegate):

class ViewController: UIViewController, StatusCodeViewModelDelegate {

或者,正如 @rmaddy 建议的那样,在 View 模型中将 loadStatusCodes 更改为:

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

然后,在viewDidLoad中:

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

关于swift - 无法使用 ViewModel 加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50573814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com