解析后显示元素 [英] Display elements after parsing

查看:35
本文介绍了解析后显示元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

解析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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆