Google Maps Delegate - PullRequest
       18

Google Maps Delegate

0 голосов
/ 19 марта 2020

Я использую Google Map в своем проекте. Я хочу дать пользователю 2 опции при нажатии на infoWindowOfMarker, который вызывает метод делегата: mapView(_ mapView: GMSMapView, didTapInfoWindowOfMarker marker: GMSMarker)

, если я хочу выполнить только одно действие, я мог бы просто получить информацию в маркере и просто выполнить свое действие. На самом деле я хочу дать пользователю 2 варианта: см. Подробно (которое отправит пользователя новому контроллеру представления) и Визит (который получит указания из базы данных API Google в зависимости от положения маркера и текущего местоположения пользователя): 2 варианта будут две кнопки.

Я не понимаю, как передать параметр маркера методу, вызываемому при нажатии кнопки.

Посмотрите код и, пожалуйста, дайте мне знать, как я могу это сделать.

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 Ответ

0 голосов
/ 19 марта 2020

Создайте подкласс из 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
    }
}
...