在swift代码应用程序中获取和解析JSON
我想获得获取JSON并在iPhone或tvOS应用程序中解析它的经验。在操场上我让它工作。但现在在iPhone或tvOS应用程序中,我都无法将数据输入标签 在代码故障排除方面获得了帮助,观看了youtube JSON解析和swift视频,但运气不好,这是一个非常小的问题,我确信,我忽略了它在swift代码应用程序中获取和解析JSON,json,swift,Json,Swift,我想获得获取JSON并在iPhone或tvOS应用程序中解析它的经验。在操场上我让它工作。但现在在iPhone或tvOS应用程序中,我都无法将数据输入标签 在代码故障排除方面获得了帮助,观看了youtube JSON解析和swift视频,但运气不好,这是一个非常小的问题,我确信,我忽略了它 import UIKit class ViewController: UIViewController { @IBOutlet weak var Title_Label: UILabel! ov
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var Title_Label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc func getNewTitles(){
struct ToDo : Decodable {
let userId, id : Int
let title : String
let completed : Bool
}
let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
URLSession.shared.dataTask(with:url) { data, _, error in
guard let data = data else { print(error!); return }
do {
let todo = try JSONDecoder().decode(ToDo.self, from: data)
// get the values out of the struct
let newsstring = (todo.title)
self.Title_Label.text = newsstring
//print(todo.userId)
//print(todo.id)
//print(todo.completed)
} catch {
print(error)
}
}.resume()
}
}
问题在最后一部分
为什么需要自我标题标签
代码没有给出错误,但文本没有发送到我的TVos屏幕上的标签中?首先,请根据命名约定对标签进行命名 您必须调用方法来检索viewDidLoad中的数据。在这种情况下,不需要将其标记为@objc 正如评论中提到的,您必须更新主线程上的标签
do {
let todo = try JSONDecoder().decode(ToDo.self, from: data)
DispatchQueue.main.async {
self.titleLabel.text = todo.title
}
} catch { ...
并至少在类或更高级别的范围内声明结构
class ViewController: UIViewController {
struct ToDo : Decodable {
let userId, id : Int
let title : String
let completed : Bool
}
...
您显示的代码中没有调用getNewTitles的地方。你确定会发生这种情况吗?无关:self.Title\u label.text=newstring必须在主线程上运行,将其括起来DispatchQueue.main.sync{…}。谢谢@Gereon,很好,我忽略了getNewTitles部分。仍然没有错误或输出。self.Title\u label.text=newstring必须在主线程上运行,请将其括在DispatchQueue.main.sync中,这是什么意思。我甚至不确定这是否是正确的方法-Xcode建议修复早期的错误。谢谢@vadian。好的是,现在它可以编译和构建,但它会给出一个异常处理错误。所以我现在遇到了一些错误。当然,在重命名标签后,您必须在Interface Builder中断开并重新连接它以应用更改。您是对的,再次使用thx@Vadian。全部编译成功。不幸的是,我的屏幕上的标签上没有数据。我今天可以再偷你的大脑一点,问一下,你将在哪里调用函数getNewTitles吗?如果你这样做的话?还是有更聪明、更简单的方法。让url=URLstring:!URLSession.shared.dataTaskwith:url{data,u,guard let data=data else{printerror!return}do{let todo=try JSONDecoder.decodeToDo.self,from:data DispatchQueue.main.async{self.titleLabel.text=todo.title}使用调试器。设置断点。dataTask是否已执行?通常在viewDidLoad中调用getNewTitles。
do {
let todo = try JSONDecoder().decode(ToDo.self, from: data)
DispatchQueue.main.async {
self.titleLabel.text = todo.title
}
} catch { ...
class ViewController: UIViewController {
struct ToDo : Decodable {
let userId, id : Int
let title : String
let completed : Bool
}
...