触摸 searchBar 时未调用 updateSearchResults 函数

Posted

技术标签:

【中文标题】触摸 searchBar 时未调用 updateSearchResults 函数【英文标题】:updateSearchResults function is not being called when searchBar is touched 【发布时间】:2020-01-21 18:12:40 【问题描述】:

updateSearchResults 函数由于某种原因没有在我的视图表控制器视图中被调用,我不知道为什么?我见过这个answer,但它与我的完全不同,我不想使用textDidChange 函数。

我有这个视图SearchViewController,它的顶部有一个搜索栏,下面有一个集合视图。 (制作 Instagram 探索页面)。一旦点击了搜索栏,它应该会显示视图SearchTableViewController,它会在表格视图中显示搜索查询的结果。

这是我的代码:

SearchViewController(主视图):

import UIKit

class SearchViewController: UIViewController 


override func viewDidLoad() 
    super.viewDidLoad()

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    guard let searchResultsViewController = storyboard.instantiateViewController(withIdentifier: "SearchResultsViewController") as? SearchTableViewController else  return

    let searchController = UISearchController(searchResultsController: searchResultsViewController)

    searchController.searchResultsUpdater = searchResultsViewController


    view.addSubview(searchController.searchBar)
    definesPresentationContext = true


SearchTableViewController(与结果一起显示的视图):

import UIKit
import Firebase

class SearchTableViewController: UIViewController 

let languages = ["Mandarin Chinese", "English", "Hindustani", "Spanish", "Arabic", "Malay", "Russian", "Bengali", "Portuguese", "French", "Hausa", "Punjabi", "German", "Japanese", "Persian", "Swahili", "Telugu", "Javanese", "Wu Chinese", "Korean"]
var searchResults: [String] = []

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() 
    super.viewDidLoad()

    tableView.dataSource = self




extension SearchTableViewController: UISearchResultsUpdating 
func updateSearchResults(for searchController: UISearchController) 
    print("typing")
    guard let searchText = searchController.searchBar.text else  return 
    searchResults = languages.filter  $0.contains(searchText) 
    tableView.reloadData()



extension SearchTableViewController: UITableViewDataSource 
func numberOfSections(in tableView: UITableView) -> Int 
    return 1


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


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell", for: indexPath)

    let language = searchResults[indexPath.row]

    cell.textLabel?.text = language
    return cell


extension SearchTableViewController: UISearchResultsUpdating 中的updateSearchResults 未被调用,我认为这是导致搜索结果未加载搜索查询数据的表视图的原因?

【问题讨论】:

您确定您的searchController 设置正确吗? @koen 正确的方法是什么?我认为这一切都很好,所以是的。 不要假设,不检查就不知道。我会通过viewDidLoad 看看searchControllersearchResultsViewController 是否被实例化。还有一个关于 Ray Wenderlich 的很好的教程,展示了所有需要的步骤。 @koen 我将如何检查它,你能指出我这个''教程' 首先,使用调试器或打印语句确保它们不为零。这是非常基本的东西。如果您只搜索uisearchcontroller tutorial,您可以找到教程等等。 【参考方案1】:

我也忘记将分配添加到导航控制器。即使您在另一个屏幕上显示搜索结果,您仍然需要添加它:

navigationItem.searchController = theSearchControllerYouInstantiated

【讨论】:

以上是关于触摸 searchBar 时未调用 updateSearchResults 函数的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT:触摸屏幕时未调用 touchesEnded

单击提交时未调用Django视图功能

UISearchController:searchBar 和 scopeBar 在第一次触摸事件上重叠

使用 UIGestureRecogniser 子类化时未调用 Touches Ended

Qt TextField 在 Android 设备上启动时未调用键盘

UISearchBar 移动到屏幕顶部时未收到触摸