UITableViewDataSource 方法不起作用

UITableViewDataSource methods are not working

没有触发数据源方法 我的 tableView 仍然是空的。 使用断点,我可以看到数据源从未执行过 我不明白为什么以及如何

import UIKit

class SearchResultsViewController: BaseViewController {
    @IBOutlet var tableView: UITableView!
    let viewModel = SearchResultsViewModel()
    let searchController = UISearchController(searchResultsController: nil)
    var data: [Result] = []
    var searchActive : Bool = false
    var action: Action?

    lazy var dataSource: SearchResultDataSource? = {
        guard let results = self.viewModel.data else { return nil }
        return SearchResultDataSource(items: results)
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        configureView()
        loadData()
    }
    private func loadData() {

        viewModel.search(term: "eminem", mediaType: .music(entity: .song, attribute: nil), country: .unitedStates, completion: { err in
            if err == nil {
                guard let results = self.viewModel.data else { return  }
                self.tableView.dataSource =  SearchResultDataSource(items: results)
                self.tableView.reloadData()
            } else {
                AlertDialogView.build(with: String(describing: err?.errorDescription), vc: self)
            }
        })
    }
    private func configureView() {
        tableView.register(UINib(nibName: "SearchResultTableViewCell", bundle: nil), forCellReuseIdentifier: SearchResultTableViewCell.identifier)
        configureSearchBarForTableView()
        tableView.delegate = self
    }
}

**这是我的数据源class** 数据源方法未被触发 我的 tableView 仍然是空的。 使用断点,我可以看到数据源从未执行过 我不明白为什么以及如何

在一个单独的文件中,这是我实现行数等的地方...

class SearchResultDataSource: NSObject {
    private var results: [Result]
    init(items: [Result]) {
        self.results = items
        super.init()
    }
    // MARK: - Helper
    func update(with data: [Result]) {
        results = data
    }
    func result(at indexPath: IndexPath) -> Result {
        return results[indexPath.row]
    }
}

// MARK: - UITableDataSource
extension SearchResultDataSource: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return results.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//        guard let cell = tableView.dequeueReusableCell(withIdentifier: SearchResultTableViewCell.identifier, for: indexPath) as? SearchResultTableViewCell else {
//            return UITableViewCell()
//        }


        guard let cell = tableView.dequeueReusableCell(withIdentifier: SearchResultTableViewCell.identifier, for: indexPath) as? UITableViewCell else {
            return UITableViewCell()
        }
        //let result = results[indexPath.row]
        //let viewModel = SearchCellViewModel(with: result)
        //cell.configure(with: viewModel)
        cell.textLabel?.text = "cell"
        return cell
    }
}

这一行

self.tableView.dataSource =  SearchResultDataSource(items: results)

您正在创建被销毁的新 SearchResultDataSource。您需要将它保存到您的 self.dataSource 中,以便您对它有很强的参考。可能需要从

lazy var dataSource: SearchResultDataSource? = {

中删除 lazy

您希望在控制器上作为 属性 保留对数据源的强引用,这样它就不会被释放。

根据您现有的代码,您可以像这样使用一个空数组对其进行初始化:

class SearchResultsViewController: BaseViewController {
    ...

    var dataSource = SearchResultDataSource(items: [])

    ...
}

然后在 loadData() 函数中,您可以使用搜索结果调用 update(with:) 方法。

private func loadData() {
    viewModel.search(term: "eminem", mediaType: .music(entity: .song, attribute: nil), country: .unitedStates, completion: { err in
        if err == nil {
            guard let results = self.viewModel.data else { return  }
            self.dataSource.update(with: results)
            self.tableView.reloadData()
        } else {
            AlertDialogView.build(with: String(describing: err?.errorDescription), vc: self)
        }
    })
}