【问题标题】:How to add a searchbar to tableview in swift?如何在 swift 中向 uitableview 添加搜索栏?
【发布时间】:2021-08-11 04:00:12
【问题描述】:

我正在尝试添加一个搜索栏功能来实际过滤我的数据。我已经能够生成我需要的数据并将其填充到表格视图中。但是,当我使用以下代码进行搜索时,搜索变量总是返回为 false,因此 tableview 永远不会更新。

【问题讨论】:

  • 委托设置了吗?顺便说一句,您的 didSelect 方法最终可能会崩溃。
  • searchBar:textDidChange: 是一个委托方法,当用户按下一个键时会被调用。您必须告诉对象该方法的实现位置。答案描述了如何设置委托。并且代码可能会崩溃,因为didSelectRowAt 总是从过滤后的数组中获取选定的项目,即使用户当前没有搜索也是如此。

标签: swift firebase uitableview uisearchbar


【解决方案1】:
class MainTableViewController: UITableViewController {
    
    let searchBarController = UISearchController(searchResultsController: nil)
    let listData = ["Sam", "Jam", "Tam", "Pam", "Kam", "Nam", "Mam"]
    var filteredData = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Demo"
        setSearchBarUI()
        getFilteredData()
    }
    
    func setSearchBarUI() {
        searchBarController.searchBar.delegate = self
        searchBarController.obscuresBackgroundDuringPresentation = false
        searchBarController.searchBar.sizeToFit()
        navigationItem.searchController = searchBarController
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredData.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SearchStuff", for: indexPath) as! SearchStuff
        cell.titleLabel.text = filteredData[indexPath.row]
        return cell
    }
    
    func getFilteredData(searchedText: String = String()) {
        let filteredListData: [String] = listData.filter({ (object) -> Bool in
            searchedText.isEmpty ? true : object.lowercased().contains(searchedText.lowercased())
        })
        filteredData = filteredListData
        tableView.reloadData()
    }

}

extension MainTableViewController: UISearchBarDelegate {
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        getFilteredData(searchedText: searchBar.text ?? String())
    }
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        searchBar.endEditing(true)
    }
    
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searchBar.endEditing(true)
        searchBar.text = String()
        getFilteredData()
    }
    
}

输出:

这样您可以忽略使用searching 变量来处理表格视图的不同状态。

【讨论】:

  • @Tom,您的意思是在导航控制器中添加搜索栏?你在用 UITableViewController 吗?
  • @Tom,我已经更新了上面的答案,请检查。
【解决方案2】:

如果你使用UINavigationController,你可以轻松实现UISearchController

let searchController = UISearchController(searchResultsController: nil)

    private func setSearchController() {
    searchController.searchBar.placeholder = "Search".localized
    searchController.searchResultsUpdater = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.delegate = self
    navigationItem.searchController = searchController
    definesPresentationContext = true
}

    override func viewDidLoad() {
    super.viewDidLoad()
    setSearchController()
}

【讨论】:

  • @Tom 如果您使用的是UISearchController,则根本不需要添加UISearchBar。也许这个教程会让你更清楚,写得很好:Tutorial link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多