Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUi加载本地Json数据_Json_Swift_Swiftui - Fatal编程技术网

SwiftUi加载本地Json数据

SwiftUi加载本地Json数据,json,swift,swiftui,Json,Swift,Swiftui,实际上,我正在学习SwiftUi,目前我还没有进入我的问题 我尝试从本地Json文件加载Json数据 我已经搜索了很多帖子,但没有什么真正帮助我,这就是为什么我选择了这个帖子 我告诉你我是如何尝试的 路径:Data/test.json [ { "id": 1, "name": "", "trade_name": "", "short_name&qu

实际上,我正在学习SwiftUi,目前我还没有进入我的问题

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

我已经搜索了很多帖子,但没有什么真正帮助我,这就是为什么我选择了这个帖子

我告诉你我是如何尝试的

路径:Data/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})
    }
}
我还没有设置显示,但我希望它出现在列表中。 在我的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”

实例成员“row”不能用于类型“indexath”;您的意思是使用这种类型的值吗

问候


CreatingBytes

SwiftUI不是UIKit,没有索引路径

视图的
body
属性必须返回某个视图,而不是其他视图

  • 首先采用
    可识别的

    struct JSONData: Codable, Identifiable { ...
    
  • 然后在
    DataLoader

    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)
             }
         }
     }  
    
  • 主页中
    移交
    数据
    并使用
    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
,以获得表视图


我强烈建议观看关于SwiftUI的WWDC 2019和2020的视频

它应该是
文本(\(data[IndexPath.row].id)”)
插入正文视图。如果我这样做,它会显示以下错误。实例成员“row”不能用于类型“indexath”;您是否打算改为使用此类型的值?是的,因为您不需要ForEach视图的IndexPath,但现在只需传递任何数字即可进行测试。我如何准确地管理它?我可以简单地做一个ForEach吗?像ForEach(1…10){Text(data[name])}对,谢谢你的帮助,我真的很感激。没有显示任何错误,但我没有看到任何列表条目。我用一个列表项替换了ForEach。但两个版本都没有显示任何内容。您的JSON解码有问题<代码>测试2和3、6、8是错误的类型。
 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)")
             }
         }
      }
   }
}