是否可以在不知道变量名的情况下更改MKAnnotation坐标?

时间:2016-08-29 11:11:45

标签: swift mapkit mkannotation

我很欣赏这个问题看似奇怪,但基本上我是在从后端数据库中提取坐标后向地图添加注释。添加的注释数量因用户而异。

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

}

5 个答案:

答案 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不允许您更改标题。