如何在更改为自定义MKAnnotation数据后更新自定义MKAnnotationView?

时间:2016-02-19 00:54:41

标签: ios swift mapkit mkannotation mkannotationview

有没有办法在更改为自定义MKAnnotation数据后更新自定义MKAnnotationView?这是观察者发挥作用的地方(以前没有使用过这些)。

目前我正在手动执行以下操作:

在对数据进行更改后的自定义MKAnnotation中:

let annView: GCCustomAnnotationView = self.mapView.viewForAnnotation(annotation) as! GCCustomAnnotationView
annView.updateText()  

在我的自定义MKAnnotationView中:

func updateText() {
    let gcAnnotation : GCAnnotation = self.annotation as! GCAnnotation
    calloutView.line1.text = gcAnnotation.locality
    calloutView.line2.text = gcAnnotation.sublocality
    calloutView.line3.text = gcAnnotation.name
}

1 个答案:

答案 0 :(得分:3)

您可以实施KVO来观察注释数据的变化。这是MKAnnotationView类用于观察coordinate MKAnnotation属性变化的机制。标准的Swift不使用KVO,它更像是一个ObjectiveC剩余的东西,在Swift中实现起来有点麻烦。我使用的一个简单解决方案是在注释数据发生变化时在自定义注释视图上调用setNeedsDisplay。这会导致drawRect被调用。在drawRect的实现中,您可以轮询注释的数据(就像在代码片段中一样)来更改视图的外观。

很长一段时间,当您的数据发生变化时:

annView.setNeedsDisplay()

就是你所需要的一切。

然后,在您的drawRect实例的MKAnnotationView实施中,您调用了updateText函数:

override func draw(_ rect: CGRect) {
    updateText()
    // etc.
}