两个文本框调用GMSPlace自动补全后显示相同地点的问题咨询
解决两个文本框共享GMSAutocomplete结果的问题
我来帮你搞定这个问题!你当前的代码里,不管是哪个文本框触发的自动补全,代理方法都会同时给locationTextField和destinationTextField赋值,所以才会出现两个框显示相同地点的情况。咱们只需要标记出当前触发自动补全的文本框,然后针对性赋值就行,具体步骤如下:
1. 添加一个变量记录活跃文本框
在你的RideAddDetailsViewController里添加一个私有变量,用来追踪当前是哪个文本框唤起了自动补全:
private var activeTextField: UITextField?
2. 唤起自动补全时标记活跃文本框
假设你是通过文本框的点击事件或者beganEditing方法唤起GMSAutocompleteViewController的,在这些方法里把activeTextField设为当前触发的文本框:
// locationTextField的点击事件示例 @IBAction func locationTextFieldTapped(_ sender: UITextField) { activeTextField = sender let autocompleteVC = GMSAutocompleteViewController() autocompleteVC.delegate = self present(autocompleteVC, animated: true) } // destinationTextField的点击事件示例 @IBAction func destinationTextFieldTapped(_ sender: UITextField) { activeTextField = sender let autocompleteVC = GMSAutocompleteViewController() autocompleteVC.delegate = self present(autocompleteVC, animated: true) }
3. 修改代理方法,针对性赋值
在didAutocompleteWith代理方法里,判断activeTextField对应的是哪个文本框,只给这个文本框赋值:
extension RideAddDetailsViewController: GMSAutocompleteViewControllerDelegate { func viewController(_ viewController: GMSAutocompleteViewController, didAutocompleteWith place: GMSPlace) { // 根据活跃文本框判断赋值目标 switch activeTextField { case locationTextField: locationTextField.text = place.name case destinationTextField: destinationTextField.text = place.name default: break } // 重置活跃文本框,避免后续逻辑出错 activeTextField = nil dismiss(animated: true, completion: nil) } func viewController(_ viewController: GMSAutocompleteViewController, didFailAutocompleteWithError error: Error) { print("Error: ", error.localizedDescription) activeTextField = nil // 出错时也要重置 dismiss(animated: true) } func wasCancelled(_ viewController: GMSAutocompleteViewController) { activeTextField = nil // 取消时也要重置 dismiss(animated: true, completion: nil) } }
这样修改后,每个文本框唤起的自动补全结果就只会对应到自己的输入框里,不会再出现两个框内容一致的问题啦~
内容的提问来源于stack exchange,提问作者Diran
相关产品推荐
相关产品推荐

