2015-09-29 23 views
15

Próbuję zmienić wersję z Swift 1.2 na Swift 2.0 i jestem na końcu zmian. Obecnie dokonuję zmian w MapViewController i nie ma żadnego błędu ani ostrzeżenia, ale niestandardowy obraz dla mojego pinezka (annotationView) nie jest przypisany do pinezki i pokazuje domyślną (czerwona kropka).Niestandardowy obraz pinezki w adnotacjiW widoku na iOS

Oto mój kod, mam nadzieję, że może mi pomóc z pewnym końcówki, ponieważ myślę, wszystko jest w porządku, ale to nadal nie działa:

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 
} 

góry dzięki,

Pozdrawiam.

Odpowiedz

15

Oto odpowiedź:

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 
} 

Pozdrowienia

+1

Dziękujemy za udostępnienie rozwiązań. Pomógł mi też –

+0

nie działa dla szybkiego 2.2 – DeyaEldeen

+0

Głosowanie odrzucone. 1) instancja "annotationView" jest tworzona w zasięgu if-let i nie istnieje w else-scope. 2) Jeśli z powodzeniem można wycofać annotację, należy ją użyć, a nie tworzyć nowej instancji. Nowa instancja powinna zostać utworzona w ramach innego zakresu, w którym nie można odjąć pakietu wielokrotnego użytku. – esbenr

41

Przyjęte rozwiązanie nie działa, ponieważ ma annotationView niezainicjowanej w else bloku.

Oto lepsze rozwiązanie. To dequeues adnotacji widok, jeśli to możliwe, lub tworzy nowy jeśli nie:

Swift 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 
} 
+1

To pomogło mi znacznie więcej niż zaakceptowana odpowiedź, wielkie dzięki @Andrey Gordeev – Alk

+1

Wow !!! To poważnie mnie uratowało !!! Miałem poważne problemy z perfekcją, ale naprawdę pomogło zobaczyć ten przykład, jak poprawnie używać identyfikatora. Myślałem, że używam go poprawnie również na początek. To powinna być zaakceptowana odpowiedź! – BryHaw

+0

Świetnie! Dziękuję Ci. – Raja

0

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 
}