如何在 swift 中向 uitableview 添加搜索栏?
Posted
技术标签:
【中文标题】如何在 swift 中向 uitableview 添加搜索栏?【英文标题】:How to add a searchbar to tableview in swift? 【发布时间】:2021-08-11 04:00:12 【问题描述】:我正在尝试添加一个搜索栏功能来实际过滤我的数据。我已经能够生成我需要的数据并将其填充到表格视图中。但是,当我使用以下代码进行搜索时,搜索变量总是返回为 false,因此 tableview 永远不会更新。
【问题讨论】:
委托设置了吗?顺便说一句,您的didSelect
方法最终可能会崩溃。
searchBar:textDidChange:
是一个委托方法,当用户按下一个键时会被调用。您必须告诉对象该方法的实现位置。答案描述了如何设置委托。并且代码可能会崩溃,因为didSelectRowAt
总是从过滤后的数组中获取选定的项目,即使用户当前没有搜索也是如此。
【参考方案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以上是关于如何在 swift 中向 uitableview 添加搜索栏?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Storyboard 中向 UITableView 添加页脚
如何在 UITableview 的标题中向 UISearchBar 添加按钮?