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

两个文本框调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:24:51