cellForRowAtIndex не вызывается - PullRequest
0 голосов
/ 31 декабря 2018

Я заполняю UITableView в ViewController как UISearchController с помощью автозаполнения Google.Тем не менее, cellForRowAtIndex не вызывается, точка останова ничего не делает.

То, что я проверил;

  • Источник данных установлен на self
  • Делегат установлен на self
  • Данные выводятся на консоль
  • У меня есть все методы делегата и источника данных

Хотя, когда я реализую тот же код с UISearchController, что итак же, как основной ViewController работает нормально.Может ли это быть, поскольку UISearchController - это другое ViewController?

Есть мысли?Любая помощь с благодарностью. - Код ниже;

MapController

class MapController: UIViewController {

private let resultsController = ResultsController()
private let searchController = UISearchController(searchResultsController: ResultsController())
private let locationManager = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    GoogleMapsService.shared.configureMapView(to: self)
    GoogleMapsService.shared.googleMapsView.delegate = self
    configureNavigationController()
    edgesForExtendedLayout = []
    definesPresentationContext = true
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    configureLocationManager()
}

func configureNavigationController() {
    guard let navigationController = navigationController else { return }
    navigationController.navigationBar.isTranslucent = false
    navigationController.navigationBar.barTintColor = .white
    navigationItem.titleView = searchController.searchBar
    searchController.delegate = resultsController
    searchController.searchResultsUpdater = resultsController
    searchController.configureSearchController()
    }
}

ResultsController

class ResultsController: UIViewController {

    private let tableView = UITableView()
    private let searchResultsCellIdentifier = "searchResultsCellIdentifier"
    private var gmsPlacesClient = GMSPlacesClient()
    private var searchResults = [GMSAutocompletePrediction]()

    lazy var filteredResults: GMSAutocompleteFilter = {
        let filteredResults = GMSAutocompleteFilter()
        filteredResults.type = .address
        return filteredResults
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        configureTableView()
    }

    func configureTableView() {
        tableView.delegate = self
        tableView.dataSource = self
        view.addSubview(tableView)
        tableView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor,
                         paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0,
                         width: 0, height: 0)
        tableView.tableFooterView = UIView()
        tableView.register(ResultsCell.self, forCellReuseIdentifier: searchResultsCellIdentifier)
        tableView.keyboardDismissMode = .interactive
        tableView.backgroundColor = UIColor(red: 242/255, green: 242/255, blue: 243/255, alpha: 1)
    }
}

extension ResultsController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return searchResults.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let searchResultsCell = tableView.dequeueReusableCell(withIdentifier: searchResultsCellIdentifier, for: indexPath) as! ResultsCell
        let result = searchResults[indexPath.row]
        searchResultsCell.result = result
        return searchResultsCell
    }
}

1 Ответ

0 голосов
/ 31 декабря 2018

Вы используете два разных экземпляра ResultsController, потому что каждый вызов инициализатора по умолчанию ResultsController() создает новый экземпляр.

Решение состоит в том, чтобы объявить searchController лениво.

private lazy var searchController : UISearchController = { 
    return UISearchController(searchResultsController: resultsController) 
}()
...