解析后显示元素

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 我在答案中添加了一个简短的示例视图代码,如果您仍有问题,那么是的,您应该针对该问题提出一个新问题。

以上是关于解析后显示元素的主要内容,如果未能解决你的问题,请参考以下文章

在PHP中解析XSD文件并在XSD中显示元素

在 PHP 中解析 XSD 文件并显示 XSD 中的元素

元素列表解析 JSON 后缺少 ]

缩小后无法解析$元素

如何在解析后获取xml文件的元素并在iPhone程序中对其进行验证

前端解析返回的对象时json显示$ref问题的解决