如何检测在 MapView 中选择了哪个注释
Posted
技术标签:
【中文标题】如何检测在 MapView 中选择了哪个注释【英文标题】:How can I detect which annotation was selected in MapView 【发布时间】:2016-08-29 12:31:17 【问题描述】:我在地图中做了一些注释,当我点击它们时,我会看到一些信息,并且我有一个打开地图的按钮,并且我无法使用正确的信息来绘制我的路线。
这是我的代码:
我的 lat & lon 有 2 个 double 数组,我从查询中填充它们。
var lat = [Double]()
var lon = [Double]()
这些行用于填充注释
self.annot = Islands(title: object["name"] as! String, subtitle: object["address"] as! String, coordinate: CLLocationCoordinate2D(latitude: (position?.latitude)!, longitude: (position?.longitude)!), info: object["address"] as! String)
self.map.addAnnotations([self.annot])
这是创建注释的地方:
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
let identifier = "pin"
if annotation.isKindOfClass(MKUserLocation)
return nil
let image = UIImage(named: "car")
let button = UIButton(type: .Custom)
button.frame = CGRectMake(0, 0, 30, 30)
button.setImage(image, forState: .Normal)
button.addTarget(self, action: #selector(Map.info(_:)), forControlEvents:UIControlEvents.TouchUpInside)
var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier)
if annotationView == nil
annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "pin")
annotationView!.canShowCallout = true
annotationView!.image = UIImage(named: "annotation")
annotationView!.rightCalloutAccessoryView = button
else
annotationView!.annotation = annotation
return annotationView
最后这是按钮的功能,我应该传递正确的信息(以及问题所在)
func info(sender: UIButton)
let latitute:CLLocationDegrees = lat[sender.tag]
let longitute:CLLocationDegrees = lon[sender.tag]
let regionDistance:CLLocationDistance = 10000
let coordinates = CLLocationCoordinate2DMake(latitute, longitute)
let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
let options = [
MKLaunchOptionsMapCenterKey: NSValue(MKCoordinate: regionSpan.center),
MKLaunchOptionsMapSpanKey: NSValue(MKCoordinateSpan: regionSpan.span)
]
let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
let mapItem = MKMapItem(placemark: placemark)
mapItem.name = name[sender.tag]
print(sender.tag)
mapItem.openInMapsWithLaunchOptions(options)
如您所见,我尝试使用发件人标签,但没有成功。
编辑:我的自定义注释类
class Islands: NSObject, MKAnnotation
var title: String?
var addr: String?
var coordinate: CLLocationCoordinate2D
var info: String?
var subtitle: String?
init(title: String, subtitle: String, coordinate: CLLocationCoordinate2D, info: String)
self.title = title
self.coordinate = coordinate
self.info = info
self.subtitle = subtitle
【问题讨论】:
【参考方案1】:为此,您可以使用从didSelectAnnotationView
中选择的Annotation
,然后将该注释存储到实例变量中,然后在您的Button
操作方法中使用注释。
var selectedAnnotation: MKPointAnnotation?
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView)
self.selectedAnnotation = view.annotation as? MKPointAnnotation
func info(sender: UIButton)
print(selectedAnnotation?.coordinate)
编辑:您有自定义的MKAnnotation
类,您需要使用它。
var selectedAnnotation: Islands?
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView)
self.selectedAnnotation = view.annotation as? Islands
【讨论】:
当我点击按钮时 好的,现在我没有得到 nil,但我得到了这个:可选(MKPointAnnotation
不起作用的原因。【参考方案2】:
对于 Swift 4
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
var selectedAnnotation = view.annotation
【讨论】:
以上是关于如何检测在 MapView 中选择了哪个注释的主要内容,如果未能解决你的问题,请参考以下文章