SwiftUI JSON tidak akan mencetak judul di ScrollView HStack (tetapi akan di Daftar)
Saya mendapatkan kesalahan dalam file ContentView.swift saya, dan ketika saya mencoba untuk mempelajarinya, saya tidak memahami apa yang dikatakan oleh kesalahan tersebut.
Saya mengerti bahwa itu tidak dapat menetapkan nilai tipe Program ke tipe Posting tetapi bagaimana saya dimaksudkan untuk mendapatkan judul?
Bagaimana saya bisa mendapatkan ini untuk dicetak di HStack?

import SwiftUI
import RemoteImage
struct ContentView: View {
@State var posts: [Program] = []
var body: some View {
List(posts){ post in
Text("hello")
/*RemoteImage(type: .url(URL(string:post.url)!), errorView: { error in
Text(error.localizedDescription)
}, imageView: { image in
image
.resizable()
.aspectRatio(contentMode: .fit)
}, loadingView: {
Text("Loading ...")
})*/
// UrlImageView(post.url)
} .onAppear {
Api().getPosts { (posts) in
self.posts = posts
}
}
}
}
import SwiftUI
// Add this top level struct to
// decode properly
struct Post: Codable {
var programs: [Program]
}
struct Program: Codable, Identifiable {
let id = UUID()
var title : String
var icon : String
}
class Api {
// Update this to return an array of Program
func getPosts(completion: @escaping ([Program]) -> ()) {
guard let url = URL(string: "https://api.drn1.com.au/api-access/programs/DRN1") else { return }
URLSession.shared.dataTask(with: url) { (data, _, _) in
// Based on the updated structs, you would no
// longer be decoding an array
let post = try! JSONDecoder().decode(Post.self, from: data!)
DispatchQueue.main.async{
// The array is stored under programs now
completion(post.programs)
}
}
.resume()
}
}
Ini juga berfungsi tetapi tidak dapat digulir.
ForEach(posts){ post in
HStack {Text(post.title)}
}.onAppear{
Api().getPosts { (posts) in
self.posts = posts
}
}
untuk memperjelas hasil akhir yang saya coba dapatkan adalah ini.
ScrollView(.horizontal) {
HStack(spacing: 20) {
ForEach(0..<10) {
Text("Item \($0)")
.foregroundColor(.white)
.font(.largeTitle)
.frame(width: 200, height: 200)
.background(Color.red)
}
}
}
Jawaban
Harap bersihkan dan bangun proyek. Kode tersebut tampaknya berfungsi dengan baik. Saya telah membuat proyek baru dan cukup menyalin & menempelkan kode di atas yang telah Anda tulis dan berfungsi dengan benar.
DIEDIT - Untuk menampilkan daftar secara horizontal, gunakan kode di bawah ini:
var body: some View {
NavigationView {
if posts.isEmpty {
Text("Loading")
} else {
ScrollView(.horizontal, showsIndicators: false) {
HStack(alignment: .center, spacing: 10) {
ForEach(posts) { post in
return Text(post.title)
}
}
}.frame(height: 200)
}
}.onAppear {
Api().getPosts { (posts) in
self.posts = posts
}
}.navigationBarTitle(Text("Home"))
}