所以对于我的mapView,我通过一个像这样的全局数组传递经度和纬度来接收来自另一个VC的坐标:
将纬度和经度添加到数组中:
var location_one: [String: Any] = ["title": eventName, "latitude": latitude, "longitude": longitude]
locations.append(location_one)
if let tbc = self.tabBarReference {
if let map = tbc.viewControllers?[1] as? MapVC {
map.loadViewIfNeeded()
map.add(newLocation:location_one)
}
}
接收MapViewVC上的坐标:
func add(newLocation location_one:[String:Any]) {
let momentaryLat = (location_one["latitude"] as! NSString).doubleValue
let momentaryLong = (location_one["longitude"] as! NSString).doubleValue
let annotation = MKPointAnnotation()
annotation.title = location_one["title"] as? String
annotation.coordinate = CLLocationCoordinate2D(latitude: momentaryLat as CLLocationDegrees, longitude: momentaryLong as CLLocationDegrees)
map.addAnnotation(annotation)
// self.map.centerCoordinate = annotation.coordinate
}
viewForannotation代码:
func mapView(_ map: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let identifier = "pinAnnotation"
var annotationView = map.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
annotationView?.canShowCallout = true
}
annotationView?.annotation = annotation
return annotationView
}
坐标正确传输并且正在调用func add(使用break语句验证),但是当我在模拟器中转到MapView时,没有放置注释。我不知道发生了什么,因为这在我测试的另一个应用程序中正常工作,但是不知道是什么原因导致它变得混乱。
我还有代码可以找到用户的当前位置并根据该位置放置一个引脚......也许这会弄乱添加坐标代码?
答案 0 :(得分:2)
我建议仔细检查momentaryLat
和momentaryLong
的数值,因为由于解析问题,它们可能不是您认为的那样(例如,确保它们在大西洋中不是0.0!)。在将其转换为location_one["latitude"]
并从中提取双值之前,我们必须查看NSString
个值。将其分解为单独的步骤,问题可能会跳出来。
你的viewFor
看起来不错。不相关,我建议将annotationView?.annotation = annotation
放在前面else
语句的if
子句中(如果刚刚创建了annotation
则不需要设置MKPinAnnotationView
1}}使用相同的annotation
...如果重复使用注释视图,则只需执行此操作。而且我通常也会检查以确保注释不是MKUserLocation
,因为我们通常会让地图视图为我们渲染。
func mapView(_ map: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation { return nil } // let the OS show user locations itself
let identifier = "pinAnnotation"
var annotationView = map.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView
if annotationView == nil {
annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
annotationView?.canShowCallout = true
} else {
annotationView?.annotation = annotation
}
return annotationView
}
但是这两个观察结果都与你缺少注释的问题有关。
请注意,viewForAnnotation
(或Swift 3中的viewFor
)方法仅在一个或多个地图的annotations
具有coordinate
时调用落在地图的可见部分内,因此它得出结论,它需要渲染相关的注释视图。因此,人们不会指望它被调用,直到(a)地图试图绘制自己和(b)一个或多个注释在地图的可见部分内(或附近)具有坐标。
例如,如果向地图对象添加了100个注释,其中只有10个属于地图的可见部分,则只会创建10个注释视图。如果你滚动地图使得5落在视野之外,另外7个滚动到视图中,它会多次调用viewForAnnotation 7,每次新显示一次注释。 viewForAnnotation可能会成功出列/重新使用滚动出视图的5个注释视图,并且只会为另外两个注释视图创建新的注释视图。 (它比这更复杂,但这是基本的想法。)
它类似于表/集合视图,其中仅为可见单元格创建单元格。因此,如果模型中有100个对象,但表中只能显示12行,则只能创建12个单元格。并且当一行滚动出视图时,它可用于对将来滚动到视图的行进行出列/重用。它是您在整个iOS中看到的常见模式,其中计算成本高昂的视图对象仅在需要时创建,并在可能的情况下重用。