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

点击UIButton报navigationController需在主线程调用错误如何解决

报错原因
  • iOS系统规定所有UI相关操作必须在主线程中执行,否则会出现线程安全问题,该报错是Xcode的主线程检查器检测到非主线程操作UI的提示。
  • 代码中URLSession.shared.dataTask的回调闭包默认在后台线程执行,你在这个闭包里直接执行了self.navigationController?.pushViewController这个UI跳转操作,同时对MapViewController的属性赋值也属于和UI展示相关的操作,因此触发了报错。
解决方法

只需要把闭包内所有和UI相关的代码,包装到主线程调度的代码块中即可,修改后对应代码如下:

do{
    let decodedData = try decoder.decode(CordinateData.self, from: safeData)
    let lat = decodedData.data[0].x
    let lon = decodedData.data[0].y
    let doubleLat = Double(lat) ?? 0.0
    let doubleLon = Double(lon) ?? 0.0
    // 调度到主线程执行UI相关操作
    DispatchQueue.main.async {
        nc.lon = doubleLon
        nc.lat = doubleLat
        self.navigationController?.pushViewController(nc, animated: true)
        //self.present(nc, animated: true, completion: nil)
        print(doubleLat)
        print(doubleLon)
    }
}catch{
    print("error")
}

内容的提问来源于stack exchange,提问作者biyush shrestha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:45:04