SwiftUi加载本地Json数据
实际上,我正在学习SwiftUi,目前我还没有进入我的问题 我尝试从本地Json文件加载Json数据 我已经搜索了很多帖子,但没有什么真正帮助我,这就是为什么我选择了这个帖子 我告诉你我是如何尝试的 路径:Data/test.jsonSwiftUi加载本地Json数据,json,swift,swiftui,Json,Swift,Swiftui,实际上,我正在学习SwiftUi,目前我还没有进入我的问题 我尝试从本地Json文件加载Json数据 我已经搜索了很多帖子,但没有什么真正帮助我,这就是为什么我选择了这个帖子 我告诉你我是如何尝试的 路径:Data/test.json [ { "id": 1, "name": "", "trade_name": "", "short_name&qu
[
{
"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”;您的意思是使用这种类型的值吗
问候
CreatingBytesSwiftUI不是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)")
}
}
}
}
}