JSON với SwiftUI bằng Array
Sep 17 2020
Tôi mới sử dụng SwiftUI và chỉ sử dụng UIKit trước đây. Tôi đã cố gắng sử dụng JSON để hiển thị tiêu đề nhưng tất cả các video hướng dẫn đều hoạt động với danh sách. Tôi không muốn sử dụng bất kỳ danh sách nào có JSON hiển thị tất cả dữ liệu. Chỉ muốn tìm nạp ví dụ thứ hai hoặc một mảng cụ thể cho tiêu đề.
Làm cách nào để xóa danh sách trong SwiftUI? Chế độ xem của tôi:
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()
}
}
NetworkManager:
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()
}
}
}
Và các tệp cấu trúc của tôi cho 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
}
Trả lời
1 pawello2222 Sep 17 2020 at 23:38
Tôi không muốn sử dụng bất kỳ danh sách nào có JSON hiển thị tất cả dữ liệu. Chỉ muốn tìm nạp ví dụ thứ hai hoặc một mảng cụ thể cho tiêu đề.
Bạn có thể sử dụng thuộc tính được tính toán để truy cập phần tử cụ thể (và tiêu đề của nó) từ postsmảng:
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()
}
}
}