You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UISearchBar取消按钮无法隐藏键盘且回调未触发的问题求助

UISearchBar取消按钮点击后键盘无法隐藏、代理方法未触发的解决方案

问题说明

点击UISearchBar的“叉号”取消按钮后无法隐藏键盘,已实现UISearchBarDelegate的searchBarCancelButtonClicked方法,但控制台未打印“searchcancel clicked”,推测该方法未被调用。尝试过searchBar.resignFirstResponder()和searchBar.endEditing(true)均无效果。

相关代码

class SearchViewController: UIViewController, UISearchBarDelegate {

@IBOutlet weak var searchProfile: UISearchBar!
@IBOutlet weak var searchTableView: UITableView!
var searchArr: [String] = ["Shaheed Claim", "Shuhda Family Issues", "Show Cause Notices", "Punishments", "Appeal", "Suspension", "Enquiries", "Demotion", "Judicial Proceeding", "Criminal Record", "HRMIS Profile", "Transfer Posting", "Education", "Skill Assessment", "Sports Skill", "Family Profile", "Beneficiary Details", "Medical History", "Psycho Profile", "Asset Details","Official Items","My Leaves", "Attendance", "Absent Details", "Promotion", "Seniority", "Rewards", "ACR Details", "Dowry Charges", "Funeral Charges", "Last Month Salary", "Medical Charges", "Scholarships", "Maintenance Allowance", "Apply Leave", "Issuance of Documents", "Request Transfer Posting", "Establishment Matters", "Other Documents", "Pay & Allowances"]

var filteredData: [String] = []
override func viewDidLoad() {
    super.viewDidLoad()
    searchTableView.delegate = self
    searchTableView.dataSource = self
    searchProfile.delegate = self
    
    filteredData = searchArr
    
}
}

extension SearchViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return filteredData.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = searchTableView.dequeueReusableCell(withIdentifier: "searchCell", for: indexPath)
    cell.textLabel?.text = filteredData[indexPath.row]
    return cell
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
     print("textdidchange")
     if searchText != "" {
          
          filteredData = searchArr.filter({$0.lowercased().contains(searchText.lowercased())})
         searchTableView.reloadData()
     } else {
          filteredData.removeAll()

         searchTableView.reloadData()
          
     }
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
   // searchBar.text = ""
    print("searchcancel clicked")
    searchBar.endEditing(true)
}
}

解决步骤

  • 确认代理关联有效性:

    1. 检查Storyboard/XIB中searchProfile的IBOutlet是否正确关联到控制器的对应属性,避免出现关联错误或未关联的情况。
    2. 确保控制器类确实遵循了UISearchBarDelegate协议(代码中已声明,但可再次确认无拼写错误)。
  • 统一代理方法归属:
    将所有UISearchBarDelegate相关方法移至单独的扩展中,避免与其他代理方法混杂,减少潜在的识别问题:

    extension SearchViewController: UISearchBarDelegate {
        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            print("textdidchange")
            if !searchText.isEmpty {
                filteredData = searchArr.filter({$0.lowercased().contains(searchText.lowercased())})
            } else {
                filteredData = searchArr // 恢复原数据,避免清空表格
            }
            searchTableView.reloadData()
        }
    
        func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
            print("searchcancel clicked")
            searchBar.text = ""
            filteredData = searchArr
            searchTableView.reloadData()
            // 多重确保键盘收起
            searchBar.resignFirstResponder()
            view.endEditing(true)
        }
    }
    
  • 强化键盘收起逻辑:
    在searchBarCancelButtonClicked中同时调用searchBar.resignFirstResponder()和view.endEditing(true),确保无论当前第一响应者是谁,都能触发键盘收起操作。

  • 修正搜索空文本时的数据逻辑:
    原代码中搜索文本为空时会清空filteredData,导致表格无数据,应改为恢复为原始的searchArr,保证取消搜索后正常显示全部内容。

内容的提问来源于stack exchange,提问作者Ahmed Saeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:19:31