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
属性 而不是注释本身)这使得 pinannotation
为 nil
导致崩溃。
将分配更改为:
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)")
}
}
我在地图上放置了一些注释,当用户触摸位置按钮时,视图会放大用户位置,其中包含一些注释。
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
属性 而不是注释本身)这使得 pinannotation
为 nil
导致崩溃。
将分配更改为:
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)")
}
}