【问题标题】:MacOS - Using a JSON array to add entries to a SwiftUI listMacOS - 使用 JSON 数组将条目添加到 SwiftUI 列表
【发布时间】:2021-06-19 17:59:06
【问题描述】:

前段时间,我问了一个question,涉及解码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 {$0.enabled}

如果这个问题有什么问题,请告诉我!提前感谢您的帮助。

【问题讨论】:

标签: arrays json swift swiftui swiftui-list


【解决方案1】:

在这里,你可以如何做到这一点,

你可以使用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]?
}

响应截图:

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2021-02-05
    相关资源
    最近更新 更多