解析后显示元素 [英] Display elements after parsing
本文介绍了解析后显示元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
解析JSON
.现在我试图在视图中显示所有这些.
Parsed JSON
. Now I'm trying to display all this in a view.
但是出现错误
Cannot find 'newsFeed' in scope
这是我的代码
--- PostsController.swift ---
import Foundation
struct NewsFeed: Codable {
var status:String = ""
var totalResults:Int = 0
var posts:[PostItem]
}
struct PostItem: Codable {
var id:Int
var title:String
var link:String
var date:String
var category:String
var thumbnail:String
var excerpt:String
var content:String
}
--- AppSwiftUIApp.swift ---
import SwiftUI
@main struct AppSwiftUIApp: App {
init() {
let urlString = "/json_news.json"
let url = URL(string: urlString)
guard url != nil else {
return
}
let session = URLSession.shared
let dataTask = session.dataTask(with: url!) { (data, response, error) in
if error == nil && data != nil {
let decoder = JSONDecoder()
do {
let newsFeed = try decoder.decode(NewsFeed.self, from: data!)
print(newsFeed.posts)
} catch {
print("Error: \(error)")
}
}
}
dataTask.resume()
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
--- MainPageView.swift ---
import SwiftUI
struct MainPageView: View {
var body: some View {
HeaderView()
ScrollView(.vertical, showsIndicators: true) {
VStack() {
ForEach(newsFeed.posts) { post in
VStack(alignment: .leading) {
Image(post.thumbnail)
.resizable()
.aspectRatio(contentMode: .fit)
}
}
}
.padding(10)
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
}
FooterView()
}
}
如何将变量传递给视图中的循环以便我可以使用它?
How I can pass a variable to a loop in a view so that I can use it?
推荐答案
在符合 ObservableObject 的类中进行 json 解码,并将解码结果赋给 @Published 属性
Perform the json decoding in a class that conforms to ObservableObject and assign the result of the decoding to a @Published property
class NewsDecoder: ObservableObject {
@Published var newsFeed: NewsFeed?
init() {
let urlString = "/json_news.json"
let url = URL(string: urlString)
guard url != nil else { return }
let session = URLSession.shared
let dataTask = session.dataTask(with: url!) { (data, response, error) in
if error == nil && data != nil {
let decoder = JSONDecoder()
do {
self.newsFeed = try decoder.decode(NewsFeed.self, from: data!)
} catch {
print("Error: \(error)")
}
}
}
dataTask.resume()
}
}
然后在您的视图中创建该类的一个实例作为@ObservedObject 并在您的 ForEach 中使用该属性
Then create an instance of that class in your view as an @ObservedObject and use the property in your ForEach
struct MainPageView: View {
@ObservedObject var newsDecoder = NewsDecoder()
并通过newsDecoder.newsFeed
struct ContentView: View {
@ObservedObject var newsDecoder = NewsDecoder()
var body: some View {
ForEach(newsDecoder.newsFeed?.posts ?? [], id: \.id) { feed in
Text(feed.title)
}
}
}
这篇关于解析后显示元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文