我的 searchBar 过滤器无法正常运行
My searchBar filter is not function correctly
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UISearchBarDelegate {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!
var filteredStates = [State]()
var states = [
State(stateName: "Alabama", abbreviation: "AL" ),
State(stateName: "Alaska", abbreviation: "AK" ),
State(stateName: "Arizona", abbreviation: "AZ"),
State(stateName: "Arkansas", abbreviation: "AR"),
State(stateName: "California", abbreviation: "CA"),
State(stateName: "Colorado", abbreviation: "CO"),
State(stateName: "Connecticut", abbreviation: "CT"),
]
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
searchBar.delegate = self
filteredStates = states
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tableView.addGestureRecognizer(tap)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell", for: indexPath) as UITableViewCell
let state = states[indexPath.row]
cell.textLabel?.text = state.stateName
cell.detailTextLabel?.text = state.abbreviation
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredStates.count
}
// This method updates filteredData based on the text in the Search Box
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredStates = searchText.isEmpty ? states : states.filter { (item: State) -> Bool in
return item.stateName.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
}
print(filteredStates)
tableView.reloadData()
}
// Wehn search bar being editing, cancel button pops up
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
self.searchBar.showsCancelButton = true
}
// When search bar cancel button clicked
// Cancel button dismiss, search text is empty, keyboard dismiss
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.showsCancelButton = false
searchBar.text = ""
searchBar.resignFirstResponder()
}
// when click outside of keyboard
// Keyboard dismiss
func handleTap() {
self.view.endEditing(true)
}
// When clicked search button
// keyboard dismiss
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
}
我的过滤器工作不正常。不确定我哪里做错了。我认为功能 searchBar 功能可能有问题。
The filter is not working correct
The filter is not working correct2
创建另一个数组来存储搜索到的值
在您的 searchBar: textDidChange
方法上实施过滤器逻辑
创建一个布尔值(例如 isActive
)以指示搜索是在 searchBarShouldBeginEditing
和 searchBarCancelButtonClicked
上发生还是取消
在您的 cellForRow
上,您可以检查 Bool isActive
以将 let state = states[indexPath.row]
切换为 let state = filteredStates[indexPath.row]
我稍微更改了您的代码,使用 filter
包含 UISearchBar 的委托方法并进行了一些更改,并使用 filteredStates
和 UITableViewDataSource
的所有方法。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!
var filteredStates = [State]()
var states = [
State(stateName: "Alabama", abbreviation: "AL" ),
State(stateName: "Alaska", abbreviation: "AK" ),
State(stateName: "Arizona", abbreviation: "AZ"),
State(stateName: "Arkansas", abbreviation: "AR"),
State(stateName: "California", abbreviation: "CA"),
State(stateName: "Colorado", abbreviation: "CO"),
State(stateName: "Connecticut", abbreviation: "CT"),
]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
filteredStates = states
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredStates.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell")!
//Access data from filteredStates array not from states array
cell.textLabel?.text = self.filteredStates[indexPath.row].stateName
cell.detailTextLabel?.text = self.filteredStates[indexPath.row].abbreviation
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(self.filteredStates[indexPath.row].stateName)
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchBar.showsCancelButton = true
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.filteredStates = searchText.isEmpty ? states : states.filter( { [=10=].stateName.localizedCaseInsensitiveContains(searchText) })
self.tableView.reloadData()
}
func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
searchBar.showsCancelButton = false
searchBar.text = ""
self.filteredStates = states
self.tableView.reloadData()
}
}
注意:我还没有添加你正在使用的代码 TapGesture
所以不要忘记添加它。
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UISearchBarDelegate {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!
var filteredStates = [State]()
var states = [
State(stateName: "Alabama", abbreviation: "AL" ),
State(stateName: "Alaska", abbreviation: "AK" ),
State(stateName: "Arizona", abbreviation: "AZ"),
State(stateName: "Arkansas", abbreviation: "AR"),
State(stateName: "California", abbreviation: "CA"),
State(stateName: "Colorado", abbreviation: "CO"),
State(stateName: "Connecticut", abbreviation: "CT"),
]
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
searchBar.delegate = self
filteredStates = states
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tableView.addGestureRecognizer(tap)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell", for: indexPath) as UITableViewCell
let state = states[indexPath.row]
cell.textLabel?.text = state.stateName
cell.detailTextLabel?.text = state.abbreviation
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredStates.count
}
// This method updates filteredData based on the text in the Search Box
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filteredStates = searchText.isEmpty ? states : states.filter { (item: State) -> Bool in
return item.stateName.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
}
print(filteredStates)
tableView.reloadData()
}
// Wehn search bar being editing, cancel button pops up
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
self.searchBar.showsCancelButton = true
}
// When search bar cancel button clicked
// Cancel button dismiss, search text is empty, keyboard dismiss
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.showsCancelButton = false
searchBar.text = ""
searchBar.resignFirstResponder()
}
// when click outside of keyboard
// Keyboard dismiss
func handleTap() {
self.view.endEditing(true)
}
// When clicked search button
// keyboard dismiss
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
}
我的过滤器工作不正常。不确定我哪里做错了。我认为功能 searchBar 功能可能有问题。
The filter is not working correct
The filter is not working correct2
创建另一个数组来存储搜索到的值
在您的 searchBar: textDidChange
方法上实施过滤器逻辑
创建一个布尔值(例如 isActive
)以指示搜索是在 searchBarShouldBeginEditing
和 searchBarCancelButtonClicked
在您的 cellForRow
上,您可以检查 Bool isActive
以将 let state = states[indexPath.row]
切换为 let state = filteredStates[indexPath.row]
我稍微更改了您的代码,使用 filter
包含 UISearchBar 的委托方法并进行了一些更改,并使用 filteredStates
和 UITableViewDataSource
的所有方法。
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!
var filteredStates = [State]()
var states = [
State(stateName: "Alabama", abbreviation: "AL" ),
State(stateName: "Alaska", abbreviation: "AK" ),
State(stateName: "Arizona", abbreviation: "AZ"),
State(stateName: "Arkansas", abbreviation: "AR"),
State(stateName: "California", abbreviation: "CA"),
State(stateName: "Colorado", abbreviation: "CO"),
State(stateName: "Connecticut", abbreviation: "CT"),
]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
filteredStates = states
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredStates.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell")!
//Access data from filteredStates array not from states array
cell.textLabel?.text = self.filteredStates[indexPath.row].stateName
cell.detailTextLabel?.text = self.filteredStates[indexPath.row].abbreviation
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(self.filteredStates[indexPath.row].stateName)
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchBar.showsCancelButton = true
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.filteredStates = searchText.isEmpty ? states : states.filter( { [=10=].stateName.localizedCaseInsensitiveContains(searchText) })
self.tableView.reloadData()
}
func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
searchBar.showsCancelButton = false
searchBar.text = ""
self.filteredStates = states
self.tableView.reloadData()
}
}
注意:我还没有添加你正在使用的代码 TapGesture
所以不要忘记添加它。