UITableView 要么没有被调用,即使我已经设置了它的委托、dataSource 并注册了可重用的单元格

UITableView either not being called even though I have set its delegate, dataSource, and registered the reusable cell

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

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

不用担心 isUserInteractionEnabled,当用户应该能够使用它时,我将其更改为 true。无论如何,我 100% 确定原型单元在故事板以及我的 cellForRowAt 函数中具有正确的重用标识符。以下是 table 视图 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 中没有填充任何内容。我认为 tableView dataSource 函数只是没有被调用,因为我在其中设置了打印语句但它们没有出现。我也 100% 确定 completionResultsMKLocalSearchCompleter)确实有效,因为我同时在我的 searchBar textDidChange 函数中使用它并打印结果。我不明白为什么它会在那个函数中起作用,而不是我的 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 函数吗?有人甚至建议它在某一时刻是约束,我已经确保这些是正确的,所以这也不是问题。感谢您的帮助!

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

通常,您会为 MKLocalSearchCompleter 设置委托并在 completerDidUpdateResults(_:) 中调用 reloadData