使用SWIFTsearch地址

在我的应用程序中,我需要用户input他的家庭地址,但我不能以任何方式显示地址只显示在用户区域,并且是完整的地址,如225e 57th st, NY, New York

我想给用户在tableview上列出的所有选项,并在用户input他的地址时过滤它们。

您可以定义一个本地search完成程序 :

 let completer = MKLocalSearchCompleter() 

然后提供查询片段:

 completer.delegate = self completer.region = MKCoordinateRegionMakeWithDistance(currentCoordinate, 10_000, 10_000) completer.queryFragment = "300 S Orange" 

并实现MKLocalSearchCompleterDelegate协议

 extension ViewController: MKLocalSearchCompleterDelegate { func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) { let addresses = completer.results.map { result in result.title + ", " + result.subtitle } // use addresses, eg update model and call `tableView.reloadData() } } 

这就产生了:

 [“美国加利福尼亚州帕萨迪纳市橘子树林大街300号”,
  “美国加利福尼亚州蒙特利公园300S橙色大道”,
  “美国加利福尼亚州格伦代尔300 S橙街”,
  “美国加利福尼亚州洛杉矶市300 S Orange博士”,
  “美国加利福尼亚州阿苏萨市的300 S Orange Ave,”
  “美国加利福尼亚州洛杉矶市橘子树林大街300号”,
  “美国加利福尼亚州布雷亚市300S橙色大道”,
  “美国加利福尼亚州Fullerton的300 S Orange Ave,”
  “美国加利福尼亚州奥兰治市300 S橙街”,
  “300 S Orange Ave,Rialto,CA,美国”,
  “美国加州Fallbrook的300S Orange Ave,”
  “美国加利福尼亚州埃斯孔迪多300 S橙街”,
  “美国加州El Cajon的300 S Orange Ave,”
  “美国加利福尼亚州图莱里市300 S Orange Cir”,
  “美国加利福尼亚州埃克塞特市300 S橙色大道”]

否则,你可以做一个本地search:

 let request = MKLocalSearchRequest() request.region = MKCoordinateRegionMakeWithDistance(currentCoordinate, 10_000, 10_000) request.naturalLanguageQuery = "300 S Pumpkin" let search = MKLocalSearch(request: request) search.start { response, error in let addresses = response?.mapItems.map { item -> String in if let addressLines = item.placemark.addressDictionary?["FormattedAddressLines"] as? [String] { return addressLines.joined(separator: " ") } return item.name ?? "Unknown" } print(addresses) } 

假设它find匹配,就会显示如下内容:

 [“300 S南瓜大道,洛杉矶,CA 92108,美国”,
  “300 S Pumpkin Pkwy,Los Angeles,CA 92103,United States”,
  “300 S Pumpkin Dr,San Gabriel,CA 91776,美国”])

现在,无论是想要FormattedAddressLines ,还是从addressDictionary提取单个组件,都取决于您,但希望这可以说明这个想法。