【问题标题】:How to make a searchable list from Json?如何从 Json 创建一个可搜索的列表?
【发布时间】:2020-05-08 15:47:18
【问题描述】:

我有一个 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 代码和机场名称的列表。

我的问题是,如何使此列表可搜索?按名称、代码或其他。 我想做一些类似于 travel agacys 的东西。我是 SwiftUI 的新手。 任何帮助将不胜感激。

【问题讨论】:

    标签: json list search swiftui


    【解决方案1】:

    你可以创建这样的东西:

    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()
        }
    }
    

    【讨论】:

    • 感谢您的帮助。但是,现在我收到一个错误:无法在文本字段行中将类型“Binding”的值转换为预期的参数类型“Binding”?
    • 糟糕,现在检查答案
    • 谢谢!现在错误消失了,但我仍然无法在列表中搜索......我可以在文本字段中输入,但它似乎没有做任何事情。 “.filter”收到一条阳离子消息“调用'filter'的结果未使用”可能与它有关吗?
    • 现在应该可以了,呵呵。我在这里输入而不是在 Xcode 中输入,这就是原因
    • 现在没有错误了,但还是不行。整天都在玩代码..你知道有什么问题吗?据我所知,文本字段和搜索结果之间存在一些沟通失误?当我删除 if 语句并仅应用“Airport.searchResults”时,即使在搜索时,列表也是空的。
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多