Как сделать список с возможностью поиска из Json? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть список 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()
    }
}

И тело:

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 и названиями аэропортов.

У меня вопрос, как мне сделать этот список доступным для поиска? по имени, коду или другому. Я хочу сделать что-то похожее на агачу путешествий. Я новичок в SwiftUI. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 08 мая 2020

Вы можете создать что-то вроде этого:

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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...