你可以定义一个local search completer:
let completer = MKLocalSearchCompleter()
然后提供查询片段:
completer.delegate = self
completer.region = MKCoordinateRegion(center: currentCoordinate, latitudinalMeters: 10_000, longitudinalMeters: 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, e.g. update model and call `tableView.reloadData()
}
}
这就产生了:
[“300 S Orange Grove Blvd,帕萨迪纳,CA,美国”,
"300 S Orange Ave, Monterey Park, CA, United States",
"300 S Orange St, Glendale, CA, United States",
“300 S Orange Dr,洛杉矶,加利福尼亚州,美国”,
"300 S Orange Ave, Azusa, CA, United States",
"300 S Orange Grove Ave, Los Angeles, CA, United States",
"300 S Orange Ave, Brea, CA, United States",
"300 S Orange Ave, Fullerton, CA, United States",
"300 S Orange St, 奥兰治, CA, 美国",
"300 S Orange Ave, Rialto, CA, United States",
"300 S Orange Ave, Fallbrook, CA, United States",
"300 S Orange St, Escondido, CA, 美国",
"300 S Orange Ave, El Cajon, CA, United States",
"300 S Orange Cir, Tulare, CA, United States",
"300 S Orange Ave, Exeter, CA, 美国"]
否则,您可以进行本地搜索:
let request = MKLocalSearch.Request()
request.region = MKCoordinateRegion(center: currentCoordinate, latitudinalMeters: 10_000, longitudinalMeters: 10_000)
request.naturalLanguageQuery = "300 S Pumpkin"
let formatter = CNPostalAddressFormatter()
formatter.style = .mailingAddress
let search = MKLocalSearch(request: request)
search.start { response, error in
let addresses = response?.mapItems.compactMap { item -> String? in
return item.placemark.postalAddress.flatMap {
formatter.string(from: $0).replacingOccurrences(of: "\n", with: ", ")
}
}
print(addresses)
}
现在,我正在使用 Contacts 框架的格式化程序(它还公开了地标上的 postalAddress 属性),但您可以按照自己的方式设置这些格式。但是,假设它找到匹配项,则显示如下:
[“300 S Pumpkin Blvd,洛杉矶,CA 92108,美国”,
“300 S Pumpkin Pkwy,洛杉矶,CA 92103,美国”,
"300 S Pumpkin Dr, San Gabriel, CA 91776, United States"])
现在,您是想要FormattedAddressLines,还是从addressDictionary 中提取单个组件,由您决定,但希望这能说明这个想法。