iOS谷歌地图didTapAtCoordinate无法获取选中标记问题
解决Google Maps中
mapView(_:didTapAt:)里selectedMarker始终为nil的问题 我之前在使用Google Maps SDK for iOS时也碰到过一模一样的问题!明明文档说mapView(_:didTapAt:)会在取消选中当前标记前调用,应该能拿到selectedMarker,但实际运行时这个值总是nil。下面是几个我亲测有效的解决思路和方案:
1. 手动维护选中标记的状态(最可靠的方案)
看起来Google Maps这个方法的实际执行时机可能和文档描述有偏差,或者在某些场景下selectedMarker会被提前置空。这时候我们可以自己维护一个变量来记录当前选中的标记,代替依赖SDK的selectedMarker:
首先,在你的ViewController或地图管理类里定义一个属性:
private var currentSelectedMarker: GMSMarker?
然后在点击标记的回调方法里更新这个属性,并切换标记的选中状态:
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { // 先重置之前选中标记的状态 currentSelectedMarker?.icon = UIImage(named: "unselected_marker_icon") // 设置当前点击的标记为选中状态 marker.icon = UIImage(named: "selected_marker_icon") // 更新当前选中的标记引用 currentSelectedMarker = marker return true // 返回true表示我们接管了这个点击事件 }
最后在mapView(_:didTapAt:)里,就可以用我们自己维护的currentSelectedMarker来操作了:
internal func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) { print("\(currentSelectedMarker) ===> Selected Marker") // 将选中标记切换为未选中状态 currentSelectedMarker?.icon = UIImage(named: "unselected_marker_icon") // 清空选中标记的引用 currentSelectedMarker = nil }
2. 检查并升级Google Maps SDK版本
有时候这个问题可能是SDK的版本bug导致的。建议你检查一下当前使用的Google Maps SDK for iOS版本,尝试升级到最新的稳定版,看看是否能解决selectedMarker为nil的问题。
3. 确认标记的isTappable属性
如果你的标记设置了isTappable = false,那么点击标记不会触发选中状态,selectedMarker自然也不会有值。所以要确保你添加到地图上的标记isTappable是默认的true(如果没有手动修改过的话,默认就是true)。
内容的提问来源于stack exchange,提问作者Pato Salazar
相关产品推荐
相关产品推荐

