MKPolyLine在Swift中不显示在MapView上

8
我在Swift中有以下代码,用于向MapView添加MKPolyline。 XCode没有告诉我有问题,就我所知,这应该是有效的。
MapView的出口:
@IBOutlet weak var mapView: MKMapView!

存储坐标的变量:

var coordinates: [CLLocationCoordinate2D] = []

从Core Data获取我的保存的坐标:
var contextMap = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!
var requestMap = NSFetchRequest(entityName: "Locations")
let predMap = NSPredicate(format: "game = %d", passedGameNumber)
requestMap.predicate = predMap
requestMap.sortDescriptors = [NSSortDescriptor(key:"time", ascending: false)]
    self.locationsList = contextMap.executeFetchRequest(requestMap, error: nil)! as [Locations]

将Core Data中的坐标添加到我的新数组中:
for index in 1..<self.locationsList.count{
    var lat = Double(self.locationsList[index].latitude)
    var long = Double(self.locationsList[index].longitude)
    var coordinatesToAppend = CLLocationCoordinate2D(latitude: lat, longitude: long)
    coordinates.append(coordinatesToAppend)
}

创建折线:
var polyLine = MKPolyline(coordinates: &coordinates, count: coordinates.count)

添加叠加层:
self.mapView.addOverlay(polyLine, level: MKOverlayLevel.AboveRoads)

将其添加到 MapView 中:
func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if overlay.isKindOfClass(MKPolyline) {
        // draw the track
        let polyLine = overlay
        let polyLineRenderer = MKPolylineRenderer(overlay: polyLine)
        polyLineRenderer.strokeColor = UIColor.blueColor()
        polyLineRenderer.lineWidth = 2.0

        return polyLineRenderer
    }

    return nil
}

我只是得到了一个空的MapView。我可以将坐标数组打印到控制台,所以我知道数据已经添加了。有什么想法吗?


你的视图控制器是否符合 MKMapViewDelegate 协议? - zisoft
地图视图的代理输出是否已连接到视图控制器?添加叠加层后,self.mapView.overlays.count是否显示1?rendererForOverlay方法实际上是否被调用(在那里设置断点或println)?坐标是否有效/后向(这种情况很常见)?与此无关,但for index in 1..<不应该是for index in 0..<吗? - user467105
谢谢你们两个。Anna,我添加了断点,但它似乎没有被调用。这可能是一个愚蠢的问题,但我该如何解决呢?我确信这很简单。关于1评论中的索引,在我之前在那里放0时它给了我一个错误 - 现在似乎用1可以工作了。 - Adam Johnson
1
你必须确保地图视图的委托已设置,否则无论如何委托方法都不会被调用。在Storyboard中,将地图的委托输出连接到视图控制器。或者,在代码中,在viewDidLoad之后的super.viewDidLoad之后,执行mapView.delegate = self。数组从索引0开始。如果从1开始,则会跳过第一个坐标。使用0时出现了什么错误? - user467105
非常感谢,非常感谢,非常感谢!安娜,你不知道我有多久没有解决 MKPolyline 问题了 - 我知道它一定是什么简单的东西!我是这个网站的新手,所以不确定是否应该将其添加为问题的答案?关于 0 的错误,我不幸无法回忆起。我在 Stack Overflow 上找到了解决方案,但显然我不必再烦恼了! - Adam Johnson
你可以回答或删除这个问题 -- 没有设置委托是一个常见的错误(尽管删除太多问题可能会给你带来其他问题)。不过,我建议你先从索引0开始查找错误。 - user467105
2个回答

9

以上方法在Swift3中会写成这样:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if overlay.isKind(of: MKPolyline.self) {
            // draw the track
            let polyLine = overlay
            let polyLineRenderer = MKPolylineRenderer(overlay: polyLine)
            polyLineRenderer.strokeColor = UIColor.blue
            polyLineRenderer.lineWidth = 2.0

            return polyLineRenderer
        }

        return MKPolylineRenderer()
    }

1
rendererFor 是一个至关重要的形容词。如果没有它,你将无法绘制叠加层。 - Michael

8

如评论中所述,问题中的代码是正确的。我只是没有设置代理。

mapView.delegate = self

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接