【问题标题】:JSON with SwiftUI using ArrayJSON 与 SwiftUI 使用数组
【发布时间】:2020-09-17 14:39:10
【问题描述】:

我是 SwiftUI 的新手,之前只使用过 UIKit。我尝试使用 JSON 显示标题,但所有教程视频都使用列表。我不想使用任何带有 JSON 的列表来显示所有数据。只想获取例如标题的第二个或特定数组。

如何在 SwiftUI 中删除列表? 我的观点:

struct ContentView: View {
    
    @ObservedObject var networkManager = NetworkManager()
    var body: some View {
            NavigationView {
            List(networkManager.posts) { post in
            HStack {
            Text(String(post.points))
            Text(post.title)
                    }}
            .navigationBarTitle("H4X0R NEWS")
        }
        .onAppear {
            self.networkManager.fetchData()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

网络管理器:

class NetworkManager: ObservableObject {
    
    @Published var posts = [Post]()
    
    func fetchData() {
        if let url = URL(string: "https://hn.algolia.com/api/v1/search?tags=front_page") {
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url) { (data, response, error) in
                if error == nil {
                    let decoder = JSONDecoder()
                    if let safeData = data {
                        do {
                            let results = try decoder.decode(Results.self, from: safeData)
                            DispatchQueue.main.async {
                                self.posts = results.hits
                            }
                        } catch {
                            print(error)
                        }
                    }
                }
            }
            task.resume()
        }
    }
}

还有我的 Json 结构文件:

struct Results: Decodable {
    let hits: [Post]
}

struct Post: Decodable, Identifiable {
    var id: String {
        return objectID
    }
    let objectID: String
    let points: Int
    let title: String
}

【问题讨论】:

    标签: swift swiftui uikit


    【解决方案1】:

    我不想使用任何带有 JSON 的列表来显示所有数据。只想要 获取例如标题的第二个或特定数组。

    您可以使用计算属性从posts 数组中访问特定元素(及其标题):

    struct ContentView: View {
        @ObservedObject var networkManager = NetworkManager()
    
        // return the title of the second item in the `posts` array
        var title: String {
            guard networkManager.posts.count >= 2 else { 
                // decide what to do when data is not yet loaded or count is <= 1
                return "Loading..."
            }
            return networkManager.posts[1].title
        }
    
        var body: some View {
            NavigationView {
                Text(title)
                    .navigationBarTitle("H4X0R NEWS")
            }
            .onAppear {
                self.networkManager.fetchData()
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2020-10-20
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2021-08-11
      相关资源
      最近更新 更多