我制作了一个自定义视图,以供用户在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/