未显示来自 JSON 的 SwiftUI Picker 数据

Posted

技术标签:

【中文标题】未显示来自 JSON 的 SwiftUI Picker 数据【英文标题】:SwiftUI Picker data from JSON not displayed 【发布时间】:2019-12-12 20:36:29 【问题描述】:

我在 swiftui 中有一个选择器,我需要从我当前托管在我的 mac 上的 json 中填充它。

当我运行代码时,显示的选择器保持为空,但数据可用(如果我点击下方的按钮打印它)。

这是我的代码:

选择器(ContentView.swift):

@State var nwm = NetworkManager()

...

Picker("Wähle deine Schule", selection: $selectedSchool) 
    ForEach(0 ..< nwm.schoolList.results.count) 
        Text(self.nwm.schoolList.results[$0].name).tag($0)
    
.labelsHidden() 

NetworkManager.swift:

class NetworkManager : ObservableObject 
    var didChange = PassthroughSubject<NetworkManager, Never>()

    var schoolList = SchoolList(results: []) 
        didSet 
            didChange.send(self)
        
    

    init() 
        guard let url = URL(string: "http://jonasmacbookpro.local:8083/iosApp/getDKSchools") else  return 

        URLSession.shared.dataTask(with: url) 
            (data, _, _) in

            let schoolList = try! JSONDecoder().decode(SchoolList.self, from: data!)

            DispatchQueue.main.async 
                self.schoolList = schoolList
            
        .resume()
    

School.swift

struct School : Identifiable, Decodable 
    let id = UUID()
    var name : String
    var ort : String
    var link : String


struct SchoolList: Decodable 
    var results: [School]

有谁知道,为什么它不起作用?

【问题讨论】:

【参考方案1】:

代替

@State var nwm = NetworkManager()

使用

@ObservedObject var nwm = NetworkManager()

而不是

var didChange = PassthroughSubject<NetworkManager, Never>()

var schoolList = SchoolList(results: []) 
    didSet 
        didChange.send(self)
    

使用

@Published var schoolList = SchoolList(results: [])

【讨论】:

这适用于静态列表,但不适用于从 json 文件创建的列表,这是我需要的情况。【参考方案2】:

要使选择器刷新是添加一个唯一的 id。您可以将 .id(UUID()) 添加到您的 Picker 中,它应该可以正常工作

【讨论】:

以上是关于未显示来自 JSON 的 SwiftUI Picker 数据的主要内容,如果未能解决你的问题,请参考以下文章

显示来自 Observable Object SwiftUI 的列表

来自 json 文件的图像未显示在网站上

来自 JSON/Dictionary 的 SwiftUI 列表

Promtail 和 Grafana - 来自 docker 容器的 json 日志文件未显示

通过 PHP 将来自 MySQL 的 JSON 解码为 SwiftUI 中的复杂结构

来自 url 的日期格式 (JSON)