【问题标题】:SwiftUi Load Local Json DataSwiftUi 加载本地 Json 数据
【发布时间】:2021-05-12 10:32:49
【问题描述】:

我实际上在学习 SwiftUi,目前我没有遇到我的问题。

我尝试从本地 Json 文件加载 Json 数据!

我搜索了很多很多帖子,但没有什么真正帮助我,这就是我选择发表这篇文章的原因。

我告诉你我是如何尝试的。

路径:数据/test.json

[
    {
    "id": 1,
    "name": "",
    "trade_name": "",
    "short_name": "",
    "test":  "",
    "test1": "",
    "test2": "",
    "test3": "",
    "test4": "",
    "test5": "",
    "test6": "",
    "test7": "",
    "test8": [],
    "test9": "",
    "test10": "",
    "test11": "",
    "test12": ""
    },
]

路径:App/DataLoader.swift

import Foundation

public class DataLoader {
    
    @Published var contentData = [JSONData]()
    
    init(){
        load()
        sort()
    }
    
    func load(){
        if let fileLocation = Bundle.main.url(forResource: "test", withExtension: "json"){
            do {
                let data = try Data(contentsOf: fileLocation)
                let jsonDecoder = JSONDecoder()
                let dataFromJson = try jsonDecoder.decode([JSONData].self, from: data)
                
                self.contentData = dataFromJson
            } catch {
                print(error)
            }
        }
    }
    
    func sort(){
        self.contentData = self.contentData.sorted(by: { $0.id < $1.id})
    }
}

在此文件中,我添加了变量。 路径:App/JsonData.swift

import Foundation

struct JSONData: Codable {
    
    var id: Int
    var name: String
    var trade_name: String
    var short_name: String
    var test: String
    var test1: String
    var test2: [String:String]
    var test3: [String:String]
    var test4: String
    var test5: String
    var test6: [String:String]
    var test7: String
    var test8: [String:String]
    var test9: String
    var test10: String
    var test11: String
    var test12: String
    
}

我还没有设置显示,但我希望它在列表中。 在我的 ContentView.swift 文件中,我将从该 Json 文件加载数据!

路径:App/ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            Home()
                .navigationTitle("Test Interface")
                .navigationBarTitleDisplayMode(.inline)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Home : View {
    let data = DataLoader().contentData
    
    var body: some View {
        data[IndexPath.row].id
    }
}

当我这样做时,它会显示一些错误。

属性'body'的返回类型要求'Int'符合'View'

实例成员“行”不能用于类型“索引路径”;您的意思是改用这种类型的值吗?

问候

创建字节

【问题讨论】:

  • 在正文视图中应该是Text("\(data[IndexPath.row].id)")
  • 如果我这样做,它会显示以下错误。实例成员 'row' 不能用于类型 'IndexPath';您的意思是改用这种类型的值吗?
  • 是的,因为没有 IndexPath 您需要 ForEach 视图,但现在只需传递任意数字进行测试。
  • 我该如何准确地管理这个?我可以简单地制作一个 ForEach 吗?像 ForEach(1...10){ Text(data[name])}

标签: json swift swiftui


【解决方案1】:

SwiftUI 不是 UIKit,没有索引路径。

Viewbody 属性必须返回一些视图,仅此而已。

  • 首先采用Identifiable

    struct JSONData: Codable, Identifiable { ...
    
  • 然后在DataLoader中采用ObservableObject

    public class DataLoader : ObservableObject {
    
  • 你必须观察根视图中的数据,将ContentView替换为

     struct ContentView: View {
         @StateObject var data = DataLoader()
    
         var body: some View {
             NavigationView {
                 Home(data: data)
                     .navigationTitle("Test Interface")
                     .navigationBarTitleDisplayMode(.inline)
             }
         }
     }  
    
  • Home 中交出data 并使用ForEach

     struct Home : View {
       @ObservedObject var data : DataLoader
    
       var body: some View {
          VStack() {
              ForEach(data.contentData) { item in
                 HStack {
                     Text(item.name)
                     Spacer()
                     Text("\(item.id)")
                 }
             }
          }
       }
    }
    

或者将ForEach 替换为List 以获得表格视图

我强烈推荐观看 WWDC 2019 和 2020 关于 SwiftUI 的视频

【讨论】:

  • 非常感谢您的帮助,我真的很感激。没有显示任何错误,但是我没有看到任何列表条目。我用列表项替换了 ForEach。但两个版本都没有显示任何内容。
  • 您的 JSON 解码有问题。 test2 和 3、6、8 是错误的类型。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2018-05-11
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多