我不知道是否有人在某个地方回答了这个问题,因为我刚刚过去一个小时都在寻找答案。我有一个应用程序,企业可以在此注册其实体店位置。问题是,没有实体商店的人正在注册。我计划通过让他们只搜索该商店的电话号码以显示其位置详细信息,而不是地址(实体位置除外)来解决此问题。
如何更改UISearchController / SearchBar / MKLocalSearchRequest以仅需要电话号码并从电话号码开始工作?
还可以搜索电话号码并显示正确的信息,但我不知道电话号码自动完成功能是否存在/有效。...输入完整的电话号码后,将显示正确的位置。
因此,需要帮助以正确的方向指出(教程,示例代码,文档等)
这是我当前的搜索控制器:
import UIKit
import MapKit
class LocationSearchTable: UITableViewController {
weak var handleMapSearchDelegate: HandleMapSearch?
var matchingItems: [MKMapItem] = []
var mapView: MKMapView?
func parseAddress(selectedItem:MKMapItem) -> String {
// put a space between "4" and "Melrose Place"
let firstSpace = (selectedItem.placemark.subThoroughfare != nil &&
selectedItem.placemark.thoroughfare != nil) ? " " : ""
// put a comma between street and city/state
let comma = (selectedItem.placemark.subThoroughfare != nil || selectedItem.placemark.thoroughfare != nil) &&
(selectedItem.placemark.subAdministrativeArea != nil || selectedItem.placemark.administrativeArea != nil) ? ", " : ""
// put a space between "Washington" and "DC"
let secondSpace = (selectedItem.placemark.subAdministrativeArea != nil &&
selectedItem.placemark.administrativeArea != nil) ? " " : ""
let addressLine = String(
format:"%@%@%@%@%@%@%@",
// street number
selectedItem.placemark.subThoroughfare ?? "",
firstSpace,
// street name
selectedItem.placemark.thoroughfare ?? "",
comma,
// city
selectedItem.placemark.locality ?? "",
secondSpace,
// state
selectedItem.placemark.administrativeArea ?? ""
)
return addressLine
}
}
extension LocationSearchTable : UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
guard let mapView = mapView,
let searchBarText = searchController.searchBar.text else { return }
let request = MKLocalSearchRequest()
request.naturalLanguageQuery = searchBarText
request.region = mapView.region
let search = MKLocalSearch(request: request)
search.start { response, _ in
guard let response = response else {
return
}
self.matchingItems = response.mapItems
self.tableView.reloadData()
}
}
}
extension LocationSearchTable {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return matchingItems.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
let selectedItem = matchingItems[indexPath.row]
cell.textLabel?.text = selectedItem.name
cell.detailTextLabel?.text = parseAddress(selectedItem: selectedItem)
return cell
}
}
extension LocationSearchTable {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedItem = matchingItems[indexPath.row]
handleMapSearchDelegate?.dropPinZoomIn(placemark: selectedItem)
dismiss(animated: true, completion: nil)
}
}