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
相关产品推荐
相关产品推荐

