2017-03-08 3 views
0

Ich bin gerade dabei, eine Anwendung für iOS zu entwickeln, und habe ein Problem mit benutzerdefinierten Anmerkungen in meiner Kartenansicht festgestellt. HierEigenartiges Anmerkungsverhalten beim Hinzufügen/Entfernen von Anmerkungen

ist die Idee:

1) I in der Benutzer Lage auf der Karte zu laden, von dieser Stelle ich eine Anfrage an meine Back-End-Server senden, alle Sehenswürdigkeiten in der Umgebung abzurufen.

2) Ich habe eine benutzerdefinierte Anmerkung wie folgt:

class CustomPointAnnotation: MKPointAnnotation { 
    var imageName: String? 
    var activeImageName : String? 
    var trainCrossingId : Int? 
    var notificationCount : UILabel = UILabel() 
    var labelIsHidden : Bool = true 
} 

, wenn ich die Anmerkungen auf der Karte hinzufügen, ich dynamisch bin Einstellung der notificationCount Etikettendaten zu verwenden, die ich von meinem Firebase Datenbank abgerufen haben.

3) Ein Benutzer kann die Größe des Radius um seine aktuelle Position erhöhen/verringern. Wenn dieser neue Radius ausgewählt ist, verwende ich mapView.removeAnnotations(mapView.annotations), um alle Anmerkungen zu entfernen und diese Anmerkungen dann mit den neuen Daten erneut hinzuzufügen, die vom Server mit dem ausgewählten Radius abgerufen wurden.

Das Problem:

Wenn zunächst die Ansicht geladen, die Anmerkungen mit den richtigen Etiketten wie erwartet arbeiten gesetzt usw.

Sobald jedoch aktualisiert ein Benutzer den Radius und ich entfernen/hinzufügen Vorherige Anmerkungen, die Anmerkungen und ihre entsprechenden Bezeichnungen zeigen nicht wie erwartet an.

Zum Beispiel ist es das, was die Karte aussieht, wenn zuerst in die Ansicht eingeben:

enter image description here

Und dann, wenn ich die Größe des Radius ändern: enter image description here

Die erwarteten Daten ist, was im Anfangsbild angezeigt wird (beim ersten Aufruf der Ansicht), aber wenn der Radius aktualisiert wird, wird der Z-Wert meiner Anmerkungen nicht berücksichtigt und notificationCount ist nicht korrekt (z. B. sollte der dritte Punkt im zweiten Diagramm gefunden werden) habe kein Etikett). Das ist seltsam, da ich print-Anweisungen und Breakpoints eingerichtet habe, um jede Annotation in func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {...} zu überwachen, und die Werte sind korrekt und was ich erwarte, jedoch zeigt die Ansicht diese Werte nicht an.

Irgendwelche Ideen, was hier schief gehen könnte? Danke im Voraus!

Bearbeiten gehören die folgenden mapView Delegierten:

// Custom annotation view 
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

     if !(annotation is CustomPointAnnotation) { 
      return nil 
     } 

     let reuseId = "trainPin" 

     var anView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) 
     if anView == nil { 
      anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
     } 
     else { 
      anView?.annotation = annotation 
     } 

     let cpa = annotation as! CustomPointAnnotation 
     let icon : UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 32, height: 32)) 
     icon.image = UIImage(named:cpa.imageName) 
     icon.layer.zPosition = 1 
     anView?.rightCalloutAccessoryView = cpa.annotationButton 
     anView?.addSubview(cpa.notificationCount) 
     anView?.addSubview(icon) 
     anView?.frame = CGRect(x: 0, y:0, width:32, height:32) 
     anView?.canShowCallout = true 
     return anView 
    } 
+0

können Sie Ihren Code schreiben für 'func mapView (_ mapView: MKMapView, viewFor Anmerkung: MKAnnotation) -> MKAnnotationView'? – chengsam

+0

Sicher, ich habe gerade bearbeitet, um es in die ursprüngliche Frage hinzuzufügen. Danke @chengsam – Dayna

Antwort

1

Ich glaube, dass als anView wird wiederverwendet werden, wird die Ansicht viele Subviews haben, wie Sie Anmerkungen entfernen und hinzufügen. Versuchen Sie, die Subviews zu entfernen, zuerst dann wieder hinzufügen:

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

    let reuseId = "trainPin" 

    var anView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) 
    if anView == nil { 
     anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
    } 
    else { 
     anView?.annotation = annotation 
    } 

    let cpa = annotation as! CustomPointAnnotation 
    let icon : UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 32, height: 32)) 
    icon.image = UIImage(named:cpa.imageName) 
    icon.layer.zPosition = 1 
    anView?.rightCalloutAccessoryView = cpa.annotationButton 
    for view in anView?.subviews { 
     view.removeFromSuperView() 
    } 
    anView?.addSubview(cpa.notificationCount) 
    anView?.addSubview(icon) 
    anView?.frame = CGRect(x: 0, y:0, width:32, height:32) 
    anView?.canShowCallout = true 
    return anView 
} 
+0

Dies hat den Trick!Vielen Dank, chengsam, ich schätze deine Hilfe sehr - ich glaube nicht, dass ich das Subview-Problem bemerkt hätte! – Dayna

+0

@Dayna Ich sah gerade Ihren vorherigen Kommentar sagte, das funktioniert nicht. Hast du etwas anderes gemacht? – chengsam

+0

war meine Schuld, baute nicht richtig und daher Code wurde nicht aktualisiert, haha! Rebuilt und es funktioniert jetzt - danke nochmal, du hast mir jede Menge Zeit gespart :) – Dayna

Verwandte Themen