mapView:didAddAnnotationViews并不总是拿起注释

时间:2015-02-18 09:36:06

标签: swift mkmapview

我在地图上放置了许多注释,当用户触摸位置按钮时,视图会放大用户位置,其中包含许多注释。

调用

mapView:didAddAnnotationViews并将当前视图中的所有注释添加到NSArray中。

有时它会添加所有注释而没有任何问题,但有时,它只会添加一个注释,即用户位置(蓝点)。

我怀疑它可能与在地图完成渲染之前被调用有关,但我不确定。

不确定是否可以将函数mapViewDidFinishRenderingMap链接到didAddAnnotationViews,以便只有在视图加载完成后才会加载(包括所有注释)。

对此有任何建议,因为我对Swift相对较新。

这是我的一些代码。我有一个每秒运行的计时器,并在控制台中打印出阵列的大小。

var timer = NSTimer()
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "update", userInfo: nil, repeats: true)

func mapView (mapView: MKMapView!, didAddAnnotationViews views: [AnyObject]!) {

    pinannotationarray = views

}   

func update() {

    if (pinannotationarray != nil && locationManager.location != nil)
     {
       println("pinannotationarray size \(pinannotationarray.count)")
     }
}

**修订代码**

var annSet: AnyObject!

func mapView(mapView: MKMapView!, regionDidChangeAnimated animated: Bool) {

annSet = mapView.annotationsInMapRect(mapView.visibleMapRect)
println("regionDidChangeAnimate: annSet count = \(annSet.count)")

for (var i = 0; i < annSet.count; i++)
    {
    pinannotation = annSet.allObjects[i].annotation as? MyAnnotation

    //fatal error: unexpectedly found nil while unwrapping an Optional value       
    println(pinannotation.title)
    }
}

1 个答案:

答案 0 :(得分:1)

annotationsInMapRect方法返回包含注释模型对象的NSSet(例如MKPointAnnotation) - 而不是视图(例如MKAnnotationView)。

这也意味着annSet.allObjects将是包含注释模型对象的NSArray

这意味着annSet.allObjects[i].annotation无效并且将失败(注释视图具有annotation属性,而不是注释本身),这会导致pinannotation nil导致崩溃。

将作业更改为:

pinannotation = annSet.allObjects[i] as? MyAnnotation
println(pinannotation.title)

或者更安全一点:

if let pa = annSet.allObjects[i] as? MyAnnotation {
    println(pa.title)
}


顺便说一句,您甚至不需要从NSArray生成NSSet。您可以直接迭代NSSet

for ann in annSet as NSSet {
    if let ma = ann as? MyAnnotation {
        println("ma.title = \(ma.title)")
    }
}