MacOS - 使用 JSON 数组将条目添加到 SwiftUI 列表
MacOS - Using a JSON array to add entries to a SwiftUI list
前段时间问了一个涉及解码JSON。我正在使用此 JSON 在列表中创建条目并决定是否勾选复选框。
我之前的问题是如何解码 JSON,我有这段代码看起来很有用(如下),但老实说,我不知道该怎么做。
我应该把它放在 SwiftUI 文件的什么地方,我可以循环遍历 this 数组中的每个 JSON 并在 SwiftUI 中添加一个条目?
我有使用 Python 的经验,我知道应该如何完成,但在 swift 方面我是初学者...
我的代码:
struct Mod: Decodable {
let id: String
let display: String
let description: String
let url: String?
let config: Bool?
let enabled: Bool?
let hidden: Bool?
let icon: String?
let categories: [String]?
// let actions: Array<OptionAction>?
// let warning: ActionWarning?
}
let modsURL = URL(string: "https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json")!
let task = URLSession.shared.dataTask(with: url) { (data, _, error) in
if let error = error { print(error); return }
do {
let result = try JSONDecoder().decode([Mod].self, from: data!)
print(result)
} catch {print(error)}
}
task.resume()
let mods_test: () = importJSON(url: modsURL)
let enableds = mods_test.map {[=11=].enabled}
如果这个问题有什么不对的地方,请告诉我!在此先感谢您的帮助。
在这里,你可以怎么做,
你可以使用State
声明变量
struct ContentView: View {
//Declare variable
@State var jsonDataList = [jsonData]()
var body: some View {
VStack {
List(jsonDataList, id: \.id) { jsonDataList in
VStack(alignment: .leading) {
HStack {
VStack(alignment: .leading) {
Text(jsonDataList.id)
.font(.title3)
.fontWeight(.bold)
Text(jsonDataList.display)
.font(.subheadline)
.fontWeight(.bold)
}
Spacer()
Image(systemName: jsonDataList.enabled ?? false ? "checkmark.square": "square")
}
}
}
.onAppear(perform: loadData)
}
}
//MARK: - Web Service
func loadData() {
guard let modsURL = URL(string: "https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json") else {
print("Invalid URL")
return
}
let task = URLSession.shared.dataTask(with: modsURL) { (data, _, error) in
if let error = error { print(error); return }
do {
let result = try JSONDecoder().decode([jsonData].self, from: data!)
jsonDataList = result
print("Response:",jsonDataList)
} catch {
print(error)
}
}
task.resume()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
// MARK: - Data Model
struct jsonData: Codable, Identifiable {
let id: String
let display: String
let description: String
let url: String?
let config: Bool?
let enabled: Bool?
let hidden: Bool?
let icon: String?
let categories: [String]?
}
响应截图:
前段时间问了一个
我应该把它放在 SwiftUI 文件的什么地方,我可以循环遍历 this 数组中的每个 JSON 并在 SwiftUI 中添加一个条目?
我有使用 Python 的经验,我知道应该如何完成,但在 swift 方面我是初学者...
我的代码:
struct Mod: Decodable {
let id: String
let display: String
let description: String
let url: String?
let config: Bool?
let enabled: Bool?
let hidden: Bool?
let icon: String?
let categories: [String]?
// let actions: Array<OptionAction>?
// let warning: ActionWarning?
}
let modsURL = URL(string: "https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json")!
let task = URLSession.shared.dataTask(with: url) { (data, _, error) in
if let error = error { print(error); return }
do {
let result = try JSONDecoder().decode([Mod].self, from: data!)
print(result)
} catch {print(error)}
}
task.resume()
let mods_test: () = importJSON(url: modsURL)
let enableds = mods_test.map {[=11=].enabled}
如果这个问题有什么不对的地方,请告诉我!在此先感谢您的帮助。
在这里,你可以怎么做,
你可以使用State
声明变量
struct ContentView: View {
//Declare variable
@State var jsonDataList = [jsonData]()
var body: some View {
VStack {
List(jsonDataList, id: \.id) { jsonDataList in
VStack(alignment: .leading) {
HStack {
VStack(alignment: .leading) {
Text(jsonDataList.id)
.font(.title3)
.fontWeight(.bold)
Text(jsonDataList.display)
.font(.subheadline)
.fontWeight(.bold)
}
Spacer()
Image(systemName: jsonDataList.enabled ?? false ? "checkmark.square": "square")
}
}
}
.onAppear(perform: loadData)
}
}
//MARK: - Web Service
func loadData() {
guard let modsURL = URL(string: "https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json") else {
print("Invalid URL")
return
}
let task = URLSession.shared.dataTask(with: modsURL) { (data, _, error) in
if let error = error { print(error); return }
do {
let result = try JSONDecoder().decode([jsonData].self, from: data!)
jsonDataList = result
print("Response:",jsonDataList)
} catch {
print(error)
}
}
task.resume()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
// MARK: - Data Model
struct jsonData: Codable, Identifiable {
let id: String
let display: String
let description: String
let url: String?
let config: Bool?
let enabled: Bool?
let hidden: Bool?
let icon: String?
let categories: [String]?
}
响应截图: