如何从Json中制作一个可搜索的列表?

问题描述 投票:0回答:1

我有一个包含机场的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的新手。任何帮助将是非常感激的。

json list search swiftui
1个回答
0
投票

你可以创建这样的东西。

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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.