UITableView 要么没有被调用,即使我已经设置了它的委托、dataSource 并注册了可重用的单元格
UITableView either not being called even though I have set its delegate, dataSource, and registered the reusable cell
所以我有一个 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
函数中具有正确的重用标识符。以下是 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% 确定 completionResults
(MKLocalSearchCompleter
)确实有效,因为我同时在我的 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
。
所以我有一个 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
函数中具有正确的重用标识符。以下是 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% 确定 completionResults
(MKLocalSearchCompleter
)确实有效,因为我同时在我的 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
。