Методы UITableViewDataSource не работают - PullRequest
0 голосов
/ 25 апреля 2019

методы dataSource не запущены. Мой 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
    }
}

** это мой класс dataSource ** методы dataSource не запускаются Мой 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
    }
}

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вы хотите сохранить строгую ссылку на источник данных как свойство на контроллере, чтобы он не освобождался.

Исходя из существующего кода, вы можете инициализировать его пустым массивом, например:

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)
        }
    })
}
0 голосов
/ 26 апреля 2019

В этой строке

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

вы создаете новый SearchResultDataSource, который уничтожается.Вы должны сохранить его в своем self.dataSource, чтобы иметь к нему сильную ссылку.Вероятно, необходимо удалить lazy из

lazy var dataSource: SearchResultDataSource? = {
...