我在地图上放置了许多注释,当用户触摸位置按钮时,视图会放大用户位置,其中包含许多注释。
调用 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)
}
}
答案 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)")
}
}