2017-10-29 5 views
2

Ich versuche, individuelle Beschriftungsansichten (I erstellen sie als Unterklasse von MKAnnotationView), aber ich habe einige Schwierigkeiten damit zu registrieren. Am Anfang habe ich versucht, nur eine benutzerdefinierte Anmerkungsansicht für einen einzelnen Annotation Marker registrieren mit dem Code (RestaurantMarkerView ist meine benutzerdefinierte Anmerkungsansicht):Wie registriere ich zwei oder mehr benutzerdefinierte Anmerkungsansichten?

mapView.register(RestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier) 

Es funktioniert gut (wenn ich den Stift tippen, zeigt es das Callout). Nun füge ich eine weitere Anmerkung Marker und versuchen Sie einen anderen Blick für sie zu registrieren, und soweit ich weiß, in diesem Fall sollte ich individuelle Kennungen für die Ansichten verwenden, so dass ich tun, dass durch diesen Code:

mapView.register(RestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: "a") 
    mapView.register(ChoosenRestaurantMarkerView.self, forAnnotationViewWithReuseIdentifier: "b") 

jetzt Wenn ich auf die Markierungen tippe, werden keine Callouts angezeigt. Wenn ich den Wiederverwendungsidentifikator eines der Marker in MKMapViewDefaultAnnotationViewReuseIdentifier ändere, zeigt dieser Marker das Callout an. Wie kann ich mehrere benutzerdefinierte Anmerkungsansichten registrieren? Vielen Dank.

+2

Wenn Sie nicht gehen, um die Standard-Anmerkungsansicht Wiederverwendung Bezeichner verwenden (die Sie in diesem Fall nicht, weil Sie verschiedene Ansichten wollen), dann müssen Sie die '' MKMapViewDelegate' Funktion mapView implementieren (_ : viewFor:) 'um die passende Ansicht zu erhalten – Paulw11

+0

@ Paulw11 Vielen Dank! –

Antwort

2

Wie @Paulw sagt, müssen Sie die MKMapViewDelegate Funktion mapView(_:viewFor:) implementieren, um die entsprechende Ansicht zurückzugeben.

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    if annotation is MKUserLocation { 
     return nil 
    } 

    if /* condition */ { 
     let reuseId = "a" 
     var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) 
     if pinView == nil { 
      pinView = RestaurantMarkerView(annotation: annotation, reuseIdentifier: reuseId) 
      pinView?.canShowCallout = true 
     } else { 
      pinView?.annotation = annotation 
     } 

     return pinView 
    } else { 
     let reuseId = "b" 
     var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) 
     if pinView == nil { 
      pinView = ChoosenRestaurantMarkerView(annotation: annotation, reuseIdentifier: reuseId) 
      pinView?.canShowCallout = true 
     } else { 
      pinView?.annotation = annotation 
     } 

     return pinView 
    } 
} 
+0

Danke. Jedes Mal, wenn ich mehr als eine benutzerdefinierte Annotation-Ansicht habe, sollte ich diese Methode verwenden, richtig? –

+0

Ja. Aber in diesem Fall denke ich, dass Switch-Anweisungen besser lesbar sind als kaskadierende Sätze von if else-Blöcken. –

+0

Ja, sicher. Danke für Ihre Hilfe. –

Verwandte Themen