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

地图搜索栏语音转文本结束后激活搜索按键问题求助

问题描述

激活地图的UISearchBar并手动输入城镇名称时,「搜索」按键会激活并变为蓝色;但使用语音转文字(STT)输入内容后,该按键呈灰色状态,点击仅能听到键盘点击声但无响应。尝试通过以下代理方法检测STT结束事件但未成功:

func searchBarShouldEndEditing(_ searchBar: UISearchBar) {
    print("Its here = searchBarShouldEndEditing")
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
    print("Its here = searchBarTextDidEndEditing")
}

补充:普通UITextField中使用STT时,「done」按键可正常变蓝。

解决方案

问题根源是STT输入完成后,UISearchBar未自动触发搜索按钮的状态更新,且你用到的两个代理方法不会在STT结束时主动调用。可以通过以下两种方式解决:

方式一:监听UISearchBar内部文本框的编辑变化事件

直接获取UISearchBar的内部UITextField,监听其.editingChanged事件,手动同步搜索按钮状态:

override func viewDidLoad() {
    super.viewDidLoad()
    searchBar.delegate = self
    
    // 获取searchBar内部的textField并添加监听
    if let textField = searchBar.searchTextField {
        textField.addTarget(self, action: #selector(textFieldContentChanged(_:)), for: .editingChanged)
    }
}

@objc private func textFieldContentChanged(_ textField: UITextField) {
    // 根据文本是否为空,更新搜索按钮的激活状态
    let hasText = !textField.text?.isEmpty ?? false
    searchBar.showsSearchResultsButton = hasText
    // 强制刷新布局确保状态生效
    searchBar.setNeedsLayout()
}

方式二:通过KVO监听SearchBar的text属性变化

通过键值观察监听UISearchBar的text属性变化,触发状态更新:

override func viewDidLoad() {
    super.viewDidLoad()
    searchBar.delegate = self
    
    // 添加KVO监听text属性
    searchBar.addObserver(self, forKeyPath: "text", options: [.new], context: nil)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    guard keyPath == "text", let searchBar = object as? UISearchBar else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }
    
    let hasText = !searchBar.text?.isEmpty ?? false
    searchBar.showsSearchResultsButton = hasText
    searchBar.setNeedsLayout()
}

// 记得在销毁时移除观察者
deinit {
    searchBar.removeObserver(self, forKeyPath: "text")
}

额外提示

如果上述方法仍不生效,可以尝试在STT输入完成后,手动触发搜索框的编辑变化事件:

// 比如在监听STT结束的回调中(如果能捕获到的话)
searchBar.searchTextField.sendActions(for: .editingChanged)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:55:30