使用Xcode刷新JSON中文本标签中的值



我正在学习Swift开发macOS应用程序,遇到了一个问题。我正试图从互联网上的JSON中获取某些数据。我已经设法获得了这样的数据,并将其放在视图中的简单文本标签中,但当我运行Xcode并获得值时,如果JSON中的值得到更新,我就看不到它反映在我的应用程序中。我知道我必须执行一个函数来刷新数据,但我一直发现的是刷新表中数据的函数,而不是简单的文本标签。不管这个问题如何,如果我想添加一个有3列的表(每个结构至少有3个数据(,其中包含JSON中的值。当我运行刷新表时,我应该在函数中包含从互联网获取数据的函数,对吧?我也有点不知所措。

这就是我所拥有的:

ViewController.swift

import Cocoa
class ViewController: NSViewController, NSTextFieldDelegate {
let user_items = UserItems()

@IBOutlet var item_salida: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()

let struc_item = user_items.Item_Struct()
let position = struc_item.firstIndex(where: { $0.name == "Leanne Graham" })!

print(struc_item[position].state!)

item_salida.stringValue = struc_item[position].state!
} }

结构快速

import Foundation
import SwiftyJSON
// MARK: - Dato
struct User: Codable {
var name: String?
var username: String?
var email: String?
}
typealias Datos = [User]
class UserItems {
func Item_Struct() -> Datos {

let urlString = "https://jsonplaceholder.typicode.com/users"
var items_available: [User] = []
if let url = NSURL(string: urlString){
if let data = try? NSData(contentsOf: url as URL, options: []){
let items = try! JSONDecoder().decode([User].self, from: data as Data)
for item in items {
items_available.append(item)
}
}
}
return items_available
}
}

非常感谢!

首先,在学习Swift时,请停止使用snake_case变量名以及NS..NSURLNSData

永远不要使用同步Data(contentsOf从远程URL加载数据。它挡住了线。

您需要URLSession和一个异步完成处理程序。

// MARK: - Dato
struct User: Codable {
let name: String
let username: String
let email: String
}
typealias Datos = [User]
class UserItems {
func loadData(completion: @escaping (Datos) -> Void) {
let url = URL(string: "https://jsonplaceholder.typicode.com/users")!
URLSession.shared.dataTask(with: url) { data, _, error in
if let error = error { print(error); return }
do {
let items = try JSONDecoder().decode([User].self, from: data!)
completion(items)
} catch {
print(error)
}
}.resume()
}
}

并将其用于控制器

class ViewController: NSViewController, NSTextFieldDelegate {
@IBOutlet var itemSalida: NSTextField!

let userItems = UserItems()
override func viewDidLoad() {
super.viewDidLoad()

userItems.loadData { users in               
if let position = users.firstIndex(where: { $0.name == "Leanne Graham" }) {
DispatchQueue.main.async {
print(users[position].username)
self.itemSalida.stringValue = users[position].username
}
}

}
}
}

忘记SwiftyJSON。不再需要它来支持Codable

最新更新