это мое первое сообщение на форуме, и я надеюсь опубликовать его правильно.
Я пытаюсь создать список Dynami c в SwiftUI, который обновляется, как только пользователь вводит что-то внутри textfield.
В списке используется API-интерфейс viaggiatreno.it, который является службой итальянской железнодорожной компании.
Указанная ссылка c, которую я буду использовать, возвращает список железнодорожных станций, которые Начните со строки, предоставленной для определенного URL.
Я создал класс Station следующим образом:
struct Station: Decodable, Identifiable {
var iid = UUID()
var name : String
var id: String
}
И класс StationFetcher, который выбирает URL-адрес API, инициализированный строкой, которая является строка, которую пользователь передаст из текстового поля:
import Foundation
public class StationFetcher : Decodable, ObservableObject {
var stations = [Station]()
var search = ""
init(search: String) {
getJsonData(string: search)
}
func getJsonData(string: String) {
let url = URL(string: "http://www.viaggiatreno.it/viaggiatrenonew/resteasy/viaggiatreno/cercaStazione/" + string)
//string is the initial string of the station
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
if error != nil {
print(error!)
} else {
if let urlContent = data {
do {
let jsonResult = try JSONSerialization.jsonObject(with: urlContent , options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject
for i in 0..<jsonResult.count {
if let station = jsonResult[i] as AnyObject? {
if let nameStation = station["nomeLungo"] as! String? {
if let idStation = station["id"] as! String? {
let searchItem = Station(name: nameStation, id: idStation)
DispatchQueue.main.async {
self.stations.append(searchItem)
}
}
} else {
print("error catching dictionary value")
}
}
}
} catch {
print("JSON Processing failed")
}
}
}
}
task.resume()
}
}
Как мне управлять этим в главном представлении SwiftUI?
import SwiftUI
struct Departure: View {
@State public var selectedStation = ""
@State private var departureDate = Date()
@ObservedObject var fetcher = StationFetcher(search: "")
var body: some View {
NavigationView {
Form {
Section(header: Text("Cerca Stazione di partenza:")) {
TextField("Da dove parti?...", text: $selectedStation)
}
Section(header: Text("Orario:")) {
DatePicker(selection: $departureDate) {
Text("Partenza")
}
}
Section(header: Text("Lista stazioni")){
List(fetcher.stations) { station in
Text(station.name)
}
}
}
.navigationBarTitle("Partenza")
}
}
}
Спасибо всем