解析后显示元素
Posted
技术标签:
【中文标题】解析后显示元素【英文标题】:Display elements after parsing 【发布时间】:2021-03-10 10:30:24 【问题描述】:解析JSON
。现在我正在尝试在视图中显示所有这些内容。
但出现错误
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()
如何将变量传递给视图中的循环以便我可以使用它?
【问题讨论】:
你能在代码中显示这个吗? 【参考方案1】:在符合 ObservableObject 的类中执行 json 解码,并将解码结果分配给 @Published 属性
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 中使用该属性
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)
【讨论】:
我有一个新错误“在使用 foreach 循环“ForEach(newsDecoder.newsFeed .posts) 发帖" 这很容易通过做一些研究来解决,但你应该可以通过在 ForEach 标题中添加id: \.id
来解决这个问题,以后请不要在你原来的问题中添加更多问题
抱歉有更多问题,但我是 Swift 的新手。我有错误。我需要做什么?创建新问题?
@LexXy 我在答案中添加了一个简短的示例视图代码,如果您仍有问题,那么是的,您应该针对该问题提出一个新问题。以上是关于解析后显示元素的主要内容,如果未能解决你的问题,请参考以下文章