用户切换 segmentController 索引时如何清理 searchText?
How to clean searchText when user switches segmentController index?
我在 tableView 中有一个 searchBar。它工作正常,直到我添加了一个 segmentController。当我更改段索引时,searchText 不会删除,这显然是一种糟糕的体验。
我试图添加一个 "text" 属性,它等于 searchText,并在用户切换段索引时执行 text = ""。但它没有用。我想我使用了一些错误的逻辑。
extension MyClass: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
var text = searchText
if segmentController.selectedSegmentIndex == 0 {
guard !text.isEmpty else { searchResult = data
tableView.reloadData()
return
}
searchResult = data.filter({ results -> Bool in
results.name.contains(text)
})
tableView.reloadData()
} else {
guard !text.isEmpty else { anotherSearchResult = anotherData
tableView.reloadData()
return
}
anotherSearchResult = anotherData.filter({ results -> Bool in
results.name.contains(text)
})
tableView.reloadData()
}
}
}
您需要观察 segmentedControl valueChanged 方法
下面的例子
class ViewController: UIViewController {
@IBOutlet weak private var segmentedControl: UISegmentedControl!
override func viewDidLoad() {
super.viewDidLoad()
// Observe value change
segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged), for: .valueChanged)
}
@objc private func segmentedControlValueChanged(_ sender: UISegmentedControl) {
// TODO: Clear searchbar
}
}
您需要在 segmentedController
上添加一个调用 addTarget
来注册一个函数,以便在选定的段发生变化时调用。
class MyClass: UIViewController {
...
@objc func clearSearchBar() {
searchBar.text = nil
}
override func viewDidLoad() {
segmentedControler.addTarget(self, action: #selector(clearSearchBar), for: .valueChanged)
}
}
我在 tableView 中有一个 searchBar。它工作正常,直到我添加了一个 segmentController。当我更改段索引时,searchText 不会删除,这显然是一种糟糕的体验。
我试图添加一个 "text" 属性,它等于 searchText,并在用户切换段索引时执行 text = ""。但它没有用。我想我使用了一些错误的逻辑。
extension MyClass: UISearchBarDelegate {
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
var text = searchText
if segmentController.selectedSegmentIndex == 0 {
guard !text.isEmpty else { searchResult = data
tableView.reloadData()
return
}
searchResult = data.filter({ results -> Bool in
results.name.contains(text)
})
tableView.reloadData()
} else {
guard !text.isEmpty else { anotherSearchResult = anotherData
tableView.reloadData()
return
}
anotherSearchResult = anotherData.filter({ results -> Bool in
results.name.contains(text)
})
tableView.reloadData()
}
}
}
您需要观察 segmentedControl valueChanged 方法
下面的例子
class ViewController: UIViewController {
@IBOutlet weak private var segmentedControl: UISegmentedControl!
override func viewDidLoad() {
super.viewDidLoad()
// Observe value change
segmentedControl.addTarget(self, action: #selector(segmentedControlValueChanged), for: .valueChanged)
}
@objc private func segmentedControlValueChanged(_ sender: UISegmentedControl) {
// TODO: Clear searchbar
}
}
您需要在 segmentedController
上添加一个调用 addTarget
来注册一个函数,以便在选定的段发生变化时调用。
class MyClass: UIViewController {
...
@objc func clearSearchBar() {
searchBar.text = nil
}
override func viewDidLoad() {
segmentedControler.addTarget(self, action: #selector(clearSearchBar), for: .valueChanged)
}
}