如何在Google Maps SDK中在函数外部使用标记的title变量
如何在Google Maps Marker外部获取并使用title变量?
我来给你几个实用的方案,解决这个问题:
方案1:利用GMSMarker的userData属性(最推荐)
GMSMarker本身就自带userData属性,专门用来存储自定义数据,完全适配你的场景!你可以直接把整个Talleres对象或者单独的title存进去,之后不管在哪个函数里拿到这个marker,都能轻松取出数据。
修改你的jsonMapTaller()代码:
for state in self.marcadores { let coordinates = CLLocationCoordinate2D(latitude: lat, longitude: long) let marker = GMSMarker(position: coordinates) marker.map = self.map marker.icon = UIImage(...) // 把整个Talleres对象存进去,后续能获取更多关联信息 marker.userData = state // 也可以只存title:marker.userData = state.title }
之后在其他函数(比如marker点击事件)里,就能这样获取title:
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { if let taller = marker.userData as? Talleres, let title = taller.title { // 这里就可以使用title了,比如打印、跳转页面等 print("点击的标记标题:\(title)") } return false }
方案2:用自定义数组存储关联数据
如果需要在函数外部直接遍历所有标记的title,你可以在类里单独声明一个数组,和marker的创建顺序保持一致,把每个state.title存进去:
首先在类中添加数组变量:
var markerTitles: [String?] = []
然后在jsonMapTaller()里补充:
for state in self.marcadores { // ... 其他创建marker的代码 ... marker.accessibilityLabel = state.title // 将title加入数组 markerTitles.append(state.title) }
之后在其他函数里,就能直接访问这个数组:
// 遍历所有存储的title for title in markerTitles { if let title = title { print(title) } }
方案3:自定义Marker子类
如果你的业务需求更复杂,还可以创建GMSMarker的子类,直接添加专属的title属性:
class CustomMarker: GMSMarker { var tallerTitle: String? }
然后在创建marker时使用这个子类:
for state in self.marcadores { let coordinates = CLLocationCoordinate2D(latitude: lat, longitude: long) let marker = CustomMarker(position: coordinates) marker.map = self.map marker.icon = UIImage(...) marker.tallerTitle = state.title }
之后在其他函数里,只要把marker转成CustomMarker类型,就能拿到title:
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { if let customMarker = marker as? CustomMarker, let title = customMarker.tallerTitle { print("标记标题:\(title)") } return false }
这几个方案里,方案1是最简洁且符合Google Maps SDK设计思路的,优先推荐使用哦!
内容的提问来源于stack exchange,提问作者AlbertB
相关产品推荐
相关产品推荐

