mapView:didAddAnnotationViews 不总是拿起注释

mapView:didAddAnnotationViews doesn't always pick up the annotations

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

mapView:didAddAnnotationViews 被调用并且应该将当前视图内的所有注释添加到 NSArray 中。

有时它会毫无问题地添加所有注释,但有时它只会添加一个注释,即用户位置(蓝点)。

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

不确定是否可以 link 将函数 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)
    }
}

annotationsInMapRect 方法 returns 一个 NSSet 包含注释模型对象(例如 MKPointAnnotation)——而不是视图(例如 MKAnnotationView ).

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

这意味着 annSet.allObjects[i].annotation 无效并且会失败(注释视图有一个 annotation 属性 而不是注释本身)这使得 pinannotationnil 导致崩溃。

将分配更改为:

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

或者更安全一点:

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


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

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