我正在尝试从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 }
提前致谢,
问候。
接受的答案无效,因为它尚未annotationView在else块中初始化。
annotationView
else
这是一个更好的解决方案。如果可能,它将使注释视图出队,否则将创建新视图:
斯威夫特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 }