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

Swift中如何禁用UITextField代理,关闭Google Places API使文本框恢复正常?

解决方案:通过状态变量控制Google Places自动补全的启用/禁用

嘿,这个需求其实很容易实现,核心思路是用一个状态变量来标记是否启用Google Places自动补全功能,然后在代理方法里根据这个状态决定行为。具体步骤如下:

1. 添加状态变量

首先在你的ViewController类里定义一个布尔型的实例变量,用来控制自动补全的开关:

var isGoogleAutocompleteEnabled = false

2. 修改按钮点击事件

更新两个按钮的动作方法,分别设置状态变量的取值,同时调整文本框的提示文字:

@IBAction func firstAction(_ sender: Any) {
    isGoogleAutocompleteEnabled = true
    searchTextField.delegate = self // 确保代理绑定,重复设置也不会有问题
    searchTextField.placeholder = "Search with Google API"
}

@IBAction func secondAction(_ sender: Any) {
    isGoogleAutocompleteEnabled = false
    // 可选:如果不需要当前类处理textField的其他代理方法,可以把delegate设为nil
    // searchTextField.delegate = nil
    searchTextField.placeholder = "Search without Google API"
}

3. 调整代理方法逻辑

修改textFieldShouldBeginEditing方法,根据状态变量决定是弹出Google自动补全控制器,还是让文本框进入普通编辑状态:

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    // 如果禁用自动补全,返回true让文本框正常打开键盘编辑
    guard isGoogleAutocompleteEnabled else {
        return true
    }
    
    // 启用自动补全时,弹出Google的自动补全控制器
    let autoCompleteController = GMSAutocompleteViewController()
    autoCompleteController.delegate = self
    let filter = GMSAutocompleteFilter()
    filter.type = .establishment
    autoCompleteController.autocompleteFilter = filter
    self.present(autoCompleteController, animated: true, completion: nil)
    return false
}

补充:处理自动补全的回调

别忘了实现GMSAutocompleteViewController的代理方法,处理用户选择地点、错误或取消的情况:

func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) {
    // 把选中的地点名称填入文本框
    searchTextField.text = place.name
    dismiss(animated: true, completion: nil)
}

func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) {
    print("自动补全出错:\(error.localizedDescription)")
    dismiss(animated: true, completion: nil)
}

func wasCancelled(_ viewController: GMSAutocompleteViewController) {
    dismiss(animated: true, completion: nil)
}

这种方式的好处是逻辑清晰,不用反复绑定/解绑代理,而且如果之后需要扩展其他代理方法(比如文本框输入限制),也不会受到影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:43:37