簡體   English   中英

來自 json、SwiftUI 的填充選擇器

[英]Filling picker from json, SwiftUI

有json(下面的鏈接),您需要將其中的數據放入picker swiftui,這可能嗎?

這是加載必要數據的類。

class pickerAPI: ObservableObject {

    @Published var groupModel: GroupModel = [GroupModelElement]()

    init() {
        loadPickerData()
    }

    func loadPickerData() {
        guard let url: URL = URL(string: "https://gist.githubusercontent.com/lisindima/a3246c9eebae2e152c1f8211d10d4255/raw/30ee8647261b839c3a00024a851a340295300787/group") else { return }
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            do {
                guard let json = data else { return }
                let swift = try JSONDecoder().decode(GroupModel.self, from: json)
                DispatchQueue.main.async {
                    self.groupModel = swift
                    print(self.groupModel)
                }
            }
            catch {
                print(error)
            }
        }
        .resume()
    }
}
public struct GroupModelElement: Codable, Hashable {
    public let startYear: Int?
    public let name: String?
    public let facultyID: String?
    public let specialityID: String?
    public let groupBr: Int?
    public let id: String?

    enum CodingKeys: String, CodingKey {
        case startYear
        case name
        case facultyID
        case specialityID
        case groupBr
        case id
    }

    public init(startYear: Int?, name: String?, facultyID: String?, specialityID: String?, groupBr: Int?, id: String?) {
        self.startYear = startYear
        self.name = name
        self.facultyID = facultyID
        self.specialityID = specialityID
        self.groupBr = groupBr
        self.id = id
    }
}

public typealias GroupModel = [GroupModelElement]

只有來自 json 的“name”字段才能進入選擇器

let group: GroupModelElement
Picker(selection: $session.choiseGroup, label: Text("Выбранная группа")) {
                        ForEach(0 ..< group.name.count) {
                            Text(self.group.name[$0])
                        }
                    }

在另一個與此代碼無關的地方完全出現錯誤。

問題是name是可選的。 您必須打開它才能使其工作。


struct ContentView: View {
    var elements:[GroupModelElement] = [
        GroupModelElement(startYear: 1990, name: "name1", facultyID: "1", specialityID: "2", groupBr: 3, id: "abc1"),
        GroupModelElement(startYear: 1991, name: "name2", facultyID: "10", specialityID: "20", groupBr: 30, id: "abc2"),
        GroupModelElement(startYear: 1992, name: "name3", facultyID: "100", specialityID: "200", groupBr: 300, id: "abc3")
    ]
    @State var selectedIndex = 0

    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker(selection: $selectedIndex, label: Text("elements")) {
                        ForEach(0 ..< elements.count) {
                            Text(self.elements[$0].name ?? "unknown")
                        }
                    }
                }
            }.navigationBarTitle("Select your name")
        }
    }
}

我可以建議你在你的GroupModelElement類中做什么。 為每個可選變量創建一個計算屬性,如下所示:

public struct GroupModelElement: Codable, Hashable {
    public let startYear: Int?
    public var wrappedStartYear:Int{
        startYear ?? -1
    }
    public let name: String?
    public var wrappedName:String{
        name ?? "unknown name"
    }
    //...

然后使用可選值更容易,您可以在選擇器內部調用Text(self.elements[$0].wrappedName)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM