Der Aufruf von setCoordinate auf MKPlacemark stürzt die App mit „unerkanntem Selektor“ ab.
-
10-12-2019 - |
Frage
Ich habe eine MKMapView, der ich eine einzelne MKPlacemark hinzufüge, um den Standort eines Gebäudes darzustellen, das der Benutzer gerade ausgewählt hat.Der Benutzer kann jeweils nur ein Gebäude auswählen und ich möchte einfach die Ortsmarkierung auf das neue Gebäude verschieben, wenn er ein neues Gebäude auswählt.Beim ersten ausgewählten Gebäude funktioniert es einwandfrei und platziert eine Markierung auf der Karte.Wenn ich versuche anzurufen setCoordinate
auf der Ortsmarkierung, um die Position der Markierung zu aktualisieren, wenn sie ein neues Gebäude auswählen -[MKPlacemark setCoordinate:]: unrecognized selector sent to instance
In MyViewController.h habe ich:
@property (nonatomic, strong)MKPlacemark *selectedBuildingPlacemark;
In MyViewController.m
@synthesize selectedBuildingPlacemark;
...
if (self.selectedBuildingPlacemark == nil) {
self.selectedBuildingPlacemark = [[MKPlacemark alloc] initWithCoordinate:myCoord addressDictionary:nil];
[mapView addAnnotation:self.selectedBuildingPlacemark];
}
else {
[self.selectedBuildingPlacemark setCoordinate:myCoord];
}
Ich dachte, MKPlacemark entspreche MKAnnotation und sollte daher implementiert werden setCoordinate
.Kann mir jemand den Irrtum meines Verhaltens zeigen?
Lösung
Die Dokumentation von MKAnnotation
sagt:
Anmerkungen, die das Ziehen unterstützen, sollten diese Methode implementieren, um die Position der Anmerkung zu aktualisieren.
Also die Methode setCoordinate:
ist optional und wird nur von Klassen implementiert, die das Ziehen unterstützen.Die Dokumentation von MKPlacemark
verweist nicht auf diese Methode und ist daher nicht implementiert.
Daher sollten Sie jedes Mal eine neue Instanz erstellen, wenn Sie ein neues Gebäude auswählen.
Andere Tipps
Wenn Sie nicht unbedingt eine verwenden müssen MKPlacemark
(Es sieht nicht so aus, weil Sie nil für das AddressDictionary übergeben), Sie könnten das verwenden MKPointAnnotation
Klasse stattdessen.
MKPointAnnotation
implementiert MKAnnotation
fügt aber a hinzu setCoordinate
Methode.