ios - UIViewController.navigationController 只能在主线程中使用
问题描述
当我按下 UIbutton 时,出现紫色错误“UIViewController.navigationController 必须仅从主线程使用”。我对这种语言有点陌生,所以有人能告诉我为什么以及如何解决这个问题吗?
@IBAction func searchButtonPressed(_ sender: UIButton) {
let houseNo = field.text
let wardNo = wardnoDropdown.text
let afterURL = "house_no=\(houseNo ?? "")&ward_no=\(wardNo ?? "")"
let escapedString = afterURL.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? ""
let finalURL = "\(searchURL)\(escapedString)"
let nc = self.storyboard?.instantiateViewController(identifier: "MapViewController") as! MapViewController
func performRequest(){
//1.create URL
if let url = URL(string: finalURL){
//2.Create URL session
let session = URLSession(configuration: .default)
//3.Give session a Task
let task = session.dataTask(with: url) { (data, response, error) in
if error != nil{
print("error")
return
}
if let safeData = data{
let decoder = JSONDecoder()
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
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")
}
}
}
//Start the task
task.resume()
}
}
performRequest()
}
解决方案
将您的视图控制器添加到 navigationController 从main thread
-
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
nc.lon = doubleLon
nc.lat = doubleLat
DispatchQueue.main.async {
self.navigationController?.pushViewController(nc, animated: true)
//self.present(nc, animated: true, completion: nil)
}
print(doubleLat)
print(doubleLon)
}catch{
print("error")
}
推荐阅读
- python - 为什么我的代码返回随机字母标记,而不是单词标记?
- java - 将 node.js 应用程序作为依赖项添加到 java maven 项目
- c - else if 和 else {if} 的区别
- java - 如何生成、编译、jar、依赖一个gradle模块
- regex - “至少包含以下字母之一”类型的正则表达式问题
- google-cloud-platform - 如何在 Bigquery 中使用字符串作为列名
- node.js - Google Drive Api v3 获取下载进度
- android - KOTLIN 不是 Java!如何在片段中使用 maketoast(或在片段中进行点击)
- excel - 从主表创建工作表并在 Excel 中超链接
- android - ConstraintLayout 最新版本不起作用