iOS中的annotationView中的自定义图钉图像

我试图从Swift 1.2更改为Swift 2.0,而且我正在进行更改。 目前我正在MapViewController中进行更改,并没有任何错误或警告,但我的引脚(annotationView)自定义图像没有分配到引脚,它显示默认的(红点)。

这里是我的代码,我希望你能帮助我一些提示,因为我觉得一切都很好,但它仍然不工作:

func parseJsonData(data: NSData) -> [Farmacia] { let farmacias = [Farmacia]() do { let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary // Parse JSON data let jsonProductos = jsonResult?["farmacias"] as! [AnyObject] for jsonProducto in jsonProductos { let farmacia = Farmacia() farmacia.id = jsonProducto["id"] as! String farmacia.nombre = jsonProducto["nombre"] as! String farmacia.location = jsonProducto["location"] as! String let geoCoder = CLGeocoder() geoCoder.geocodeAddressString(farmacia.location, completionHandler: { placemarks, error in if error != nil { print(error) return } if placemarks != nil && placemarks!.count > 0 { let placemark = placemarks?[0] // Add Annotation let annotation = MKPointAnnotation() annotation.title = farmacia.nombre annotation.subtitle = farmacia.id annotation.coordinate = placemark!.location!.coordinate self.mapView.addAnnotation(annotation) } }) } } catch let parseError { print(parseError) } return farmacias } func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { let identifier = "MyPin" if annotation.isKindOfClass(MKUserLocation) { return nil } // Reuse the annotation if possible var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) if annotationView == nil { annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView!.canShowCallout = true } annotationView!.image = UIImage(named: "custom_pin.png") let detailButton: UIButton = UIButton(type: UIButtonType.DetailDisclosure) annotationView!.rightCalloutAccessoryView = detailButton print(annotationView!.image) return annotationView } 

提前致谢,

问候。

接受的答案不起作用,因为它具有在else块中未初始化的annotationView

这是一个更好的解决scheme。 如果可能的话,它会使注解视图出列,否则创build一个新视图:

斯威夫特3,4

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { // Don't want to show a custom image if the annotation is the user's location. guard !(annotation is MKUserLocation) else { return nil } // Better to make this class property let annotationIdentifier = "AnnotationIdentifier" var annotationView: MKAnnotationView? if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) { annotationView = dequeuedAnnotationView annotationView?.annotation = annotation } else { annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) annotationView?.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) } if let annotationView = annotationView { // Configure your annotation view here annotationView.canShowCallout = true annotationView.image = UIImage(named: "yourImage") } return annotationView } 

Swift 2.2

 func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { // Don't want to show a custom image if the annotation is the user's location. guard !annotation.isKindOfClass(MKUserLocation) else { return nil } let annotationIdentifier = "AnnotationIdentifier" var annotationView: MKAnnotationView? if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier) { annotationView = dequeuedAnnotationView annotationView?.annotation = annotation } else { let av = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) av.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure) annotationView = av } if let annotationView = annotationView { // Configure your annotation view here annotationView.canShowCallout = true annotationView.image = UIImage(named: "yourImage") } return annotationView } 

答案是:

 func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { let identifier = "MyPin" if annotation.isKindOfClass(MKUserLocation) { return nil } let detailButton: UIButton = UIButton(type: UIButtonType.DetailDisclosure) if let annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) { annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "pin") annotationView.canShowCallout = true annotationView.image = UIImage(named: "custom_pin.png") annotationView.rightCalloutAccessoryView = detailButton } else { annotationView.annotation = annotation } return annotationView } 

问候

SWIFT 3,4

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { if annotation.isKind(of: MKUserLocation.self) { return nil } let annotationIdentifier = "AnnotationIdentifier" var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) if (pinView == nil) { pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) } pinView?.canShowCallout = false return pinView }