【问题标题】:cellForRowAtIndex not getting calledcellForRowAtIndex 没有被调用
【发布时间】:2023-04-04 08:24:02
【问题描述】:

我正在使用 Google 自动完成功能将 ViewController 中的 UITableView 填充为 UISearchController。但是,cellForRowAtIndex 没有被调用,断点什么都不做。

我检查过的;

  • 数据源设置为自身
  • 委托设置为自我
  • 数据正在控制台中打印出来
  • 我拥有所有委托和数据源方法

虽然,当我用UISearchController 实现与主ViewController 相同的代码时,它工作正常。这可能是因为UISearchController 是不同的ViewController

有什么想法吗?非常感谢任何帮助。- 下面的代码;

地图控制器

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()
    }
}

结果控制器

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
    }
}

【问题讨论】:

  • 请注意resultsControllersearchResultsController 的参数是两个不同的对象。默认初始化器ResultsController() 总是创建一个新实例。
  • 如果在tableView :numberOfRowsInSection: 中设置断点会发生什么? searchResults.count 的值是多少?
  • 在 numberOfRows 处设置断点给了我; searchResults [GMSAutocompletePrediction] 0 个值,在选择 searchBar 时是正确的
  • @vadian 你有在另一个 ViewController 中设置 UISearchController 的更有效的例子吗?
  • 也许这个改变会起作用private lazy var searchController : UISearchController = { return UISearchController(searchResultsController: resultsController) }()这个改变确保只使用一个控制器实例。

标签: ios swift uitableview google-places-api googleplacesautocomplete


【解决方案1】:

您正在使用ResultsController 的两个不同实例,因为每次调用默认初始化程序ResultsController() 都会创建一个新实例。

一种解决方案是懒惰地声明searchController

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2019-03-31
    • 2012-12-16
    相关资源
    最近更新 更多