首页 > 解决方案 > 即使我设置了它的委托、数据源并注册了可重用单元格,UITableView 也没有被调用

问题描述

所以我有一个UITableView(不是 tableView 控制器),我已经设置了它的delegate, dataSource,甚至注册了它的可重用单元格,在我的viewDidLoad

searchTableView.delegate = self
searchTableView.dataSource = self
searchTableView.isHidden = true
searchTableView.isUserInteractionEnabled = false
searchTableView.register(UITableViewCell.self, forCellReuseIdentifier: "SearchResultCell")

不用担心isUserInteractionEnabled,我将其更改true为用户应该能够使用它的时间。无论如何,我 100% 确定原型单元在情节提要中具有正确的重用标识符以及我的cellForRowAt功能。以下是表格视图dataSource功能:

//MARK: - UITableViewDelegate & UITableViewDataSource Methods

extension MapViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        searchCompleter.queryFragment = searchBar.searchTextField.text!
        let completionResults = searchCompleter.results
        print("Yo")
        return completionResults.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        searchCompleter.queryFragment = searchBar.searchTextField.text!
        let completionResults = searchCompleter.results
        print(completionResults)
        print("yo")
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "SearchResultCell", for: indexPath)
    
        cell.textLabel?.text = completionResults[indexPath.row].subtitle
    
        return cell
    }
}

然而,当我在模拟器中时,没有任何东西填充 tableView。我认为 tableViewdataSource函数只是没有被调用,因为我在其中设置了打印语句并且它们没有出现。我也 100% 确定completionResults(an MKLocalSearchCompleter) 确实有效,因为我同时在我的 searchBartextDidChange函数中使用它并打印结果。我不明白为什么它会在那个函数中工作,而不是我的 tableview 函数,除非它必须在 searchBar 函数中。无论如何,以防万一,这是该功能:

//MARK: - UISearchBarDelegate Methods

extension MapViewController: UISearchBarDelegate, MKLocalSearchCompleterDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        if searchText.count > 0 {
            searchTableView.isHidden = false
            searchTableView.isUserInteractionEnabled = true
        } else {
            searchTableView.isHidden = true
            searchTableView.isUserInteractionEnabled = false
        }
    
        searchCompleter.queryFragment = searchBar.searchTextField.text!
        let completionResults = searchCompleter.results
        print(completionResults) 
    }
}

有谁知道为什么我searchTableView不会调用这些dataSource函数?甚至有人建议它在某一时刻是约束,我已经确保这些是正确的,所以这也不是问题。谢谢你的帮助!

标签: iosswiftxcodeuitableviewdelegates

解决方案


你似乎没有打电话searchTableView.reloadData()。除非您调用该方法,否则它不会重新加载表。

通常,您会为MKLocalSearchCompleterand 调用设置一个委托reloadDatacompleterDidUpdateResults(_:)


推荐阅读