Ios searchBarCancelButtonClicked函数为';不要被叫
问题 如果在搜索栏处于活动状态时按下取消按钮(即闪烁的键入指示灯和键盘显示),则搜索栏取消按钮单击功能将运行,并打印“取消按下” 但是,如果在搜索栏未处于活动状态时按下“取消”按钮(即没有输入指示器,也没有键盘显示),则不会调用搜索栏取消按钮单击功能。而是调用searchBarTextDidBeginEditing函数 问题 1) 这是正常的行为吗? 2) 如何更改此设置,以便即使搜索栏未处于活动状态(first responder),也能运行searchBarCancelButtonClicked函数 注意Ios searchBarCancelButtonClicked函数为';不要被叫,ios,swift,uisearchcontroller,Ios,Swift,Uisearchcontroller,问题 如果在搜索栏处于活动状态时按下取消按钮(即闪烁的键入指示灯和键盘显示),则搜索栏取消按钮单击功能将运行,并打印“取消按下” 但是,如果在搜索栏未处于活动状态时按下“取消”按钮(即没有输入指示器,也没有键盘显示),则不会调用搜索栏取消按钮单击功能。而是调用searchBarTextDidBeginEditing函数 问题 1) 这是正常的行为吗? 2) 如何更改此设置,以便即使搜索栏未处于活动状态(first responder),也能运行searchBarCancelButtonClick
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar)
{
DispatchQueue.main.async
{
self.searchBarHeader.setShowsCancelButton(true, animated: true)
}
searchActive = true
tableView.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar)
{
print("Cancel Pressed")
DispatchQueue.main.async
{
self.searchBarHeader.setShowsCancelButton(false, animated: true)
searchBar.resignFirstResponder()
}
searchBarHeader.text = ""
searchActive = false
filteredStopArray = []
tableView.reloadData()
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
DispatchQueue.main.async
{
searchBar.resignFirstResponder()
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
{
filteredStopArray = stopArray.filter(
{ (dict) -> Bool in
let nameString: NSString = dict["Name"]! as NSString
let range = nameString.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
return range.location != NSNotFound
})
tableView.reloadData()
}
我没有使用UISearchController,只使用UISearchBar和UISearchBarDelegate函数
代码
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar)
{
DispatchQueue.main.async
{
self.searchBarHeader.setShowsCancelButton(true, animated: true)
}
searchActive = true
tableView.reloadData()
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar)
{
print("Cancel Pressed")
DispatchQueue.main.async
{
self.searchBarHeader.setShowsCancelButton(false, animated: true)
searchBar.resignFirstResponder()
}
searchBarHeader.text = ""
searchActive = false
filteredStopArray = []
tableView.reloadData()
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
{
DispatchQueue.main.async
{
searchBar.resignFirstResponder()
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
{
filteredStopArray = stopArray.filter(
{ (dict) -> Bool in
let nameString: NSString = dict["Name"]! as NSString
let range = nameString.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
return range.location != NSNotFound
})
tableView.reloadData()
}
我的猜测是,只有当搜索栏是第一响应者时,“取消”按钮才会接收事件。当搜索栏不是第一响应者时,搜索栏中的任何触摸都将使其成为第一响应者并呈现keboard。@RohanBhale您知道有什么方法可以使搜索栏CancelButtonClicked函数在搜索栏不是第一响应者时被调用吗?@JordaW不建议这样做,但您可以通过以下方式调用从SearchBartextDiBeginediting点击的cancel按钮:一些扭曲的逻辑