You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MKMapView不显示路线且启动跳转至南极洲问题求助

问题修复方案

以下是代码中存在的问题及对应修复方式:

1. 未绑定地图代理导致路线无法渲染

你已经实现了MKMapViewDelegate协议的路线渲染方法,但没有给mapView设置代理对象,系统不会触发自定义渲染逻辑,路线自然无法显示。
修复:在viewDidLoad中添加代理绑定:

override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self // 新增这行
    // 原有逻辑不变
}

2. 方法调用逻辑错误导致地图跳转到南极洲

存在的问题:

  • 你在viewWillAppear中才将mapView添加到当前视图,而viewDidLoad的执行顺序早于viewWillAppear,此时调用drawRoute添加overlay会无效
  • drawRoute方法你传入了routeData参数,但内部完全没有使用该参数,直接读取成员变量routeCoordinates,逻辑冗余容易出错
  • 如果JSON解析逻辑是异步执行,调用drawRoute时routeCoordinates还没有数据,方法直接返回,既没有添加路线也没有设置地图显示区域,地图默认加载经纬度(0,0)附近区域,就是你看到的南极洲位置

修复:

  1. 将setMapConstraints方法调用移到viewDidLoad的最开头,确保调用drawRoute前mapView已经完成布局
  2. 确认JSON解析完成、routeCoordinates已经赋值后再调用drawRoute
  3. 优化drawRoute逻辑,删除冗余参数或者使用传入的参数值
override func viewDidLoad() {
    super.viewDidLoad()
    setMapConstraints() // 移到最开头
    mapView.delegate = self
    if let routeJSON = self.getJSON() {
        self.parseJSON(jsonData: routeJSON)
        // 确认parseJSON是同步执行的话,在解析完成后调用drawRoute
        drawRoute()
    }
    print(routeCoordinates)
}

// 优化drawRoute方法,删除冗余参数
func drawRoute() {
    if routeCoordinates.count == 0 {
        return
    }
    let coordinates = routeCoordinates.map { $0.coordinate }
    DispatchQueue.main.async {
        self.routeOverlay = MKPolyline(coordinates: coordinates, count: coordinates.count)
        self.mapView.addOverlay(self.routeOverlay!, level: .aboveRoads)
        let customEdgePadding = UIEdgeInsets(top: 40, left: 20, bottom: 40, right: 20)
        self.mapView.setVisibleMapRect(self.routeOverlay!.boundingMapRect, edgePadding: customEdgePadding, animated: false)
    }
}

额外校验项

如果完成上述修改后还有异常,打印routeCoordinates确认所有坐标都是有效值,避免经纬度颠倒或者空值导致地图区域计算错误。

内容的提问来源于stack exchange,提问作者nix.codes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:36:04