我制作了一个自定义视图,以供用户在Google地图上点击标记时显示。因此,我将委托方法markerInfoWindow编写为:

func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {

        let infoWindow = Bundle.main.loadNibNamed("emergencyInfo", owner: self.view, options: nil)!.first! as! emergencyInfo

        infoWindow.frame = CGRect(x: 0, y: 0, width: 200, height: 110)
        infoWindow.titleOfCenter.text = marker.title
        infoWindow.addressOfCenter.text = marker.snippet
        infoWindow.callNowButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

        return infoWindow
    }

buttonTapped功能实现为
@objc func buttonTapped(sender: UIButton) {
        print("Yeah! Button is tapped!")
    }

但是问题在于它没有进入函数内部。

更新

基于答案,我开始关注this tutorial,因此这是我实现的:

首先,我声明了这两个变量:
var tappedMarker = GMSMarker()
var infoWindow = emergencyInfo(frame: CGRect(x: 0, y: 0, width: 200, height: 100))

然后在didTap中,我这样做:
func mapView(_ mapView:GMSMapView,didTap标记:GMSMarker)-> Bool {
    let location = CLLocationCoordinate2D(latitude: marker.position.latitude, longitude: marker.position.longitude)

    tappedMarker = marker
    infoWindow.removeFromSuperview()
    infoWindow = emergencyInfo(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
    infoWindow.center = mapView.projection.point(for: location)
    infoWindow.callNowButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) //getting error on this line
    self.view.addSubview(infoWindow)

    return false
}

最后,我将markerInfoWindow方法更改为:
 func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
        return UIView()
}

现在,当我运行代码时,在设置#selector(buttonTapped)的那一行上出现错误

致命错误:解开Optional值时意外发现nil

根据一些研究,我发现此错误发生在左侧,即infoWindow.callNowButton,因为我有一个标签infoWindow.titleOfCenter.text,此刻我刚刚为其提供了"Title",并且由于相同的错误而崩溃。

最佳答案

Nikhil是正确的。但是,确实有一个不错的解决方法,需要一些努力和更改。

在继续解决方法之前,请阅读以下答案https://stackoverflow.com/a/15281141/3231194:

可能是Google地图文档中正式提到的
Android API,以下有关信息窗口的限制适用于
Google Maps iOS SDK也:

信息窗口不是实时视图,而是将视图呈现为
图片到地图上。因此,您在视图上设置的所有侦听器都是
忽略,您无法区分各种点击事件
部分视图。建议您不要放置交互式组件
(例如按钮,复选框或文本输入)中的自定义内容
信息窗口。

因此,基本上,单击信息窗口的任何部分只会触发
“didTapWindowOfMarker”

然后,要解决该问题(我已经完成了它,并且可以工作),您可以按照本教程http://kevinxh.github.io/swift/custom-and-interactive-googlemaps-ios-sdk-infowindow.html进行操作,这很容易。

底线是:您将需要更改在地图上显示infoWindow的方式。不用以markerInfoWindow返回自定义infoWindow,而是将其替换为UIView()

接下来是在didTap marker中处理(或显示)自定义infoWindow的演示,在其中,您还将处理选择器的设置,例如:

func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
    guard let tappedJob = marker.userData as? Job else { return false }
    self.mapView.selectedMarker = marker

    jobInfoWindow?.buttons.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
    jobInfoWindow?.job = tappedJob
    jobInfoWindow?.center = mapView.projection.point(for: marker.position)
    self.view.addSubview(jobInfoWindow!)

    return false
}

关于ios - 自定义标记代码段未调用按钮操作目标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46662619/

10-13 03:59