我很欣赏这个问题看似奇怪,但基本上我是在从后端数据库中提取坐标后向地图添加注释。添加的注释数量因用户而异。
let details = Annotation(title: "\(userName)",
locationName: "",
coordinate: CLLocationCoordinate2D(latitude:convertLat!, longitude: convertlon!))
self.mapView.addAnnotation(details as MKAnnotation)
self.mapView.selectAnnotation(details, animated: true)
我遇到的麻烦是我想更新'详细信息的坐标。特定时间间隔的注释,但我无法访问'详细信息'注释,因为它当然超出了范围。
例如,是否可以通过标题名称访问注释并相应地更改其坐标?
另一种选择是删除所有注释并使用更新的坐标重新创建它们,但这是我试图避免的。
可能值得注意的是,出于多种原因,我不能简单地在我的方法之外创建细节注释。
感谢。
已更新 所以我尝试了一种略有不同的方法,如下所示:
for annotation in mapView.annotations as [MKAnnotation] {
if (annotation as AnyObject).title == "Title of annotation" {
annotation.title = "Change to something else"
}
}
然而,我无法更改标题,因为斯威夫特告诉我它只是“只获得”#39;财产,我不明白为什么。
向mapView添加注释:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
// if (annotation is MKUserLocation) { return nil }
let reuseID = "icon"
var v = mapView.dequeueReusableAnnotationView(withIdentifier: reuseID)
if v != nil {
v?.annotation = annotation
} else {
v = MKAnnotationView(annotation: annotation, reuseIdentifier: nil)
v?.image = snapShotImage
v?.canShowCallout = true
}
return v
}
答案 0 :(得分:3)
创建MKAnnotation
的子类。
class CustomAnnotation: MKAnnotation {
var _title: String = "Title of annotation"
override var title: String {
get {
return _title
}
set {
self._title = newValue
}
}
}
现在使用自定义类创建注释。
let details = CustomAnnotation(title: "\(userName)",
locationName: "",
coordinate: CLLocationCoordinate2D(latitude:convertLat!, longitude: convertlon!))
由于你有title属性的getter和setter方法,现在你可以更新特定或所有注释(就像你使用for-in循环一样;如你的问题中所述)。
答案 1 :(得分:2)
在不知道包含坐标的源类的结构的情况下,您可以创建一个包含源对象和创建的MKAnnotation的类。该类将通过addObserver
使用KVO来观察源坐标的任何变化,然后将它们应用于注释:对标题/副标题也可以这样做。正常地将创建的注释添加到地图中。确保拥有mapView的视图控制器保留上述类的实例,以便ARC不回收所有内容!
假设您仍然可以访问和更新源,UI将自行管理。
答案 2 :(得分:2)
您没有编辑注释,而是替换它。理想情况下,您将保留对注释的引用,以便您可以删除它,然后创建并添加一个新注释(并更新对该新注释的引用)。如果您因某些原因不想这样做,那么您可以使用循环找到要删除的正确注释,然后创建并添加新注释。
答案 3 :(得分:2)
我理解您删除并替换所有注释的犹豫,但现在您已经确定了相关的特定注释,为什么不在您正在显示的for循环内删除,重新创建和重新添加该注释:
let replacement = annotation
replacement.title = "Change to something else"
self.mapView.addAnnotation(replacement)
mapView.removeAnnotation(annotation)
答案 4 :(得分:2)
您需要将注释强制转换为您自己的Annotation
类,而不是MKAnnotation
协议:
if let annotations = mapView.annotations as? [Annotation] {
for annotation in annotations {
if annotation.title == "Title of annotation" {
annotation.title = "Change to something else"
}
}
}
MKAnnotation
协议仅指定title
属性的getter,这就是为什么转换为MKAnnotation
不允许您更改标题。