我有一个包含机场的Json列表,我可以在列表中查看。
Json列表。
[
{
"name": "Hartsfield Jackson Atlanta Intl",
"city": "Atlanta",
"country": "United States",
"iata_code": "ATL",
"_geoloc": {
"lat": 33.636719,
"lng": -84.428067
},
"links_count": 1826,
"objectID": "3682"
},
{
"name": "Chicago Ohare Intl",
"city": "Chicago",
"country": "United States",
"iata_code": "ORD",
"_geoloc": {
"lat": 41.978603,
"lng": -87.904842
},
"links_count": 1108,
"objectID": "3830"
},
]
我的代码是这样的:
struct Model: Codable, Identifiable, Hashable {
enum CodingKeys: CodingKey {
case name
case city
case country
case iata_code
}
var id = UUID()
var name, city, country, iata_code: String
}
class Json: ObservableObject {
@Published var json = [Model]()
init() {
load()
}
func load() {
let path = Bundle.main.path(forResource: "Airports", ofType: "json")
let url = URL(fileURLWithPath: path!)
URLSession.shared.dataTask(with: url) { (data, responce, error) in
do {
if let data = data {
let json = try JSONDecoder().decode([Model].self, from: data)
DispatchQueue.main.sync {
self.json = json
}
} else {
print("no Data")
}
} catch {
print(error)
}
}.resume()
}
}
And Body:
struct ContentView: View {
@ObservedObject var Airport = Json()
var body: some View {
List(Airport.json) { item in
VStack(alignment: .leading) {
Text(item.iata_code)
Text(item.name)
}
}
}
}
这给了我一个包含Iata代码和机场名称的列表。
我的问题是,我怎样才能使这个列表可搜索? 通过名称、代码或其他。我想做一些类似于旅游agacys的东西。我是SwiftUI的新手。任何帮助将是非常感激的。
你可以创建这样的东西。
struct ContentView: View {
@ObservedObject var Airport = Json()
var body: some View {
VStack {
TextField("Search for names", text: $Airport.searchText)
List(Airport.searchResults.isEmpty ? Airport.json : Airport.searchResults) { item in
VStack(alignment: .leading) {
Text(item.iata_code)
Text(item.name)
}
}
}
}
}
class Json: ObservableObject {
@Published var json = [Model]()
@Published var searchText: String = "" {
didSet {
// Here comes your search condition...
self.searchResults = self.json.filter { $0.name.starts(with: self.searchText) }
// Uncomment the line below if you want to accept that the word you're typing in is the middle on the name
// self.searchResults = self.json.filter { $0.name.contains(self.searchText) }
}
}
@Published var searchResults: [Model] = []
init() {
load()
}
func load() {
let path = Bundle.main.path(forResource: "Airports", ofType: "json")
let url = URL(fileURLWithPath: path!)
URLSession.shared.dataTask(with: url) { (data, responce, error) in
do {
if let data = data {
let json = try JSONDecoder().decode([Model].self, from: data)
DispatchQueue.main.sync {
self.json = json
}
} else {
print("no Data")
}
} catch {
print(error)
}
}.resume()
}
}