Ios searchBarCancelButtonClicked函数为';不要被叫

Ios searchBarCancelButtonClicked函数为';不要被叫,ios,swift,uisearchcontroller,Ios,Swift,Uisearchcontroller,问题 如果在搜索栏处于活动状态时按下取消按钮(即闪烁的键入指示灯和键盘显示),则搜索栏取消按钮单击功能将运行,并打印“取消按下” 但是,如果在搜索栏未处于活动状态时按下“取消”按钮(即没有输入指示器,也没有键盘显示),则不会调用搜索栏取消按钮单击功能。而是调用searchBarTextDidBeginEditing函数 问题 1) 这是正常的行为吗? 2) 如何更改此设置,以便即使搜索栏未处于活动状态(first responder),也能运行searchBarCancelButtonClick

问题

如果在搜索栏处于活动状态时按下取消按钮(即闪烁的键入指示灯和键盘显示),则搜索栏取消按钮单击功能将运行,并打印“取消按下”

但是,如果在搜索栏未处于活动状态时按下“取消”按钮(即没有输入指示器,也没有键盘显示),则不会调用搜索栏取消按钮单击功能。而是调用searchBarTextDidBeginEditing函数

问题

1) 这是正常的行为吗? 2) 如何更改此设置,以便即使搜索栏未处于活动状态(first responder),也能运行searchBarCancelButtonClicked函数

注意

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按钮:一些扭曲的逻辑