谷歌地图代表
Posted
技术标签:
【中文标题】谷歌地图代表【英文标题】:Google Maps Delegate 【发布时间】:2020-06-30 00:34:45 【问题描述】:我在我的项目中使用谷歌地图。我想在点击调用委托方法的 infoWindowOfMarker 时为用户提供 2 个选项:mapView(_ mapView: GMSMapView, didTapInfoWindowOfMarker marker: GMSMarker)
如果我只想执行一项操作,我可以检索标记中的信息并执行我的操作。实际上我想给用户 2 个选项:查看详细信息(这会将用户发送到新的视图控制器)和访问(它将根据标记的位置属性和用户的当前位置从 google apis 获取方向) 这两个选项将是两个按钮。
我不知道如何将标记参数传递给点击按钮时调用的方法。
查看代码,请告诉我任何其他方法可以做到这一点。
class ItemMarker: GMSMarker
let item: Item
init(item: Item)
self.item = item
super.init(position: item.coordinate)
//and necessary initialization
class MapViewController: GMSMapViewDelegate
@IBOutlet weak var actionStackView: UIStackView!
@IBoutlet weak var mapView: GMSMapView!
var currentUser: User!
var users = [User]()
var items = [Item]()
override viewDidLoad()
super.viewDidLoad()
//implement code for mapView
self.currentUser = UserManager.shared.currentUser
self.users = UserManager.shared.users
users.forEach self.items.append(contentOf: $0.items
self.items.forEach let marker = ItemMarker(item: $0)
marker.map = mapView
@objc func seeDetailButtonTapped(_ sender: UIButton)
//here I want to verify if the user is the owner of the item he wants to see the detail,
//then allow him to modify it and present the new view controller modally.
//if the user is not the owner, then not allowing editing, and show the new view controller.
//i guess for that I need to be able to have the marker for that.
@objc func visitButtonTapped(_ sender: UIButton)
//here I want to use the user current location,
//the item location, get the directions for the user,
//I need the ItemMarker to do that.
func mapView(_ mapView: GMSMapView, didtapInfoWindowOfMarker marker: GMSMarker)
let visitButton = UIButton(type: .roundedRect)
visitButton.setTitle(Utilities.visit, for: .normal)
visitButton.backgroundColor = UIColor.systemBlue
visitButton.addTarget(self, action: #selector(visitButtonTapped(_:)), for: .touchUpInside)
let seeDetail = UIButton(type: .roundedRect)
seeDetail.setTitle(Utilities.detail, for: .normal)
seeDetail.backgroundColor = UIColor.systemGray
seeDetail.addTarget(self, action: #selector(showDetailHouse(_:)), for: .touchUpInside)
actionStackView.addArrangedSubview(visitButton)
actionStackView.addArrangedSubview(seeDetail)
let stackViewHeight = actionStackView.intrinsicContentSize.height
let topInset = self.mapView.safeAreaInsets.top
mapView.padding = UIEdgeInsets(top: topInset, left: 0.0, bottom: stackViewHeight, right: 0.0)
UIView.animate(withDuration: 0.25)
actionStackView.bottomAnchor.constraint(equalTo: self.mapView.safeAreaLayoutGuide.bottomAnchor, constant: 2.0).isActive = true
actionStackView.alpha = 0.9
如何将标记传递给 seeDetail 方法和 visitButtonTapped 方法? ????
【问题讨论】:
【参考方案1】:从 UIButton 创建一个具有所需属性的子类,然后您可以在 tap
处理程序中使用它。
class UIButtonWithMarker: UIButton
var itemMarker: ItemMarker?
func mapView(_ mapView: GMSMapView, didtapInfoWindowOfMarker marker: GMSMarker)
let visitButton = UIButtonWithMarker(type: .roundedRect)
visitButton.itemMarker = marker as? ItemMarker
visitButton.setTitle(Utilities.visit, for: .normal)
visitButton.backgroundColor = UIColor.systemBlue
visitButton.addTarget(self, action: #selector(visitButtonTapped(_:)), for: .touchUpInside)
let seeDetail = UIButtonWithMarker(type: .roundedRect)
seeDetail.itemMarker = marker as? ItemMarker
seeDetail.setTitle(Utilities.detail, for: .normal)
seeDetail.backgroundColor = UIColor.systemGray
seeDetail.addTarget(self, action: #selector(showDetailHouse(_:)), for: .touchUpInside)
@objc func seeDetailButtonTapped(_ sender: UIButtonWithMarker)
if itemMarker = sender.itemMarker
//use itemMarker here
@objc func visitButtonTapped(_ sender: UIButtonWithMarker)
if itemMarker = sender.itemMarker
//use itemMarker here
【讨论】:
非常感谢?!尊重✊以上是关于谷歌地图代表的主要内容,如果未能解决你的问题,请参考以下文章