Last active
April 11, 2019 08:43
-
-
Save iannase/b509f188586f72941ba5e47ce51b0373 to your computer and use it in GitHub Desktop.
Swift 4 version of the Map Tutorial code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import MapKit | |
class LocationSearchTable: UITableViewController { | |
weak var handleMapSearchDelegate: HandleMapSearch? | |
var matchingItems: [MKMapItem] = [] | |
var mapView: MKMapView? | |
func parseAddress(selectedItem:MKPlacemark) -> String { | |
// put a space between "4" and "Melrose Place" | |
let firstSpace = (selectedItem.subThoroughfare != nil && | |
selectedItem.thoroughfare != nil) ? " " : "" | |
// put a comma between street and city/state | |
let comma = (selectedItem.subThoroughfare != nil || selectedItem.thoroughfare != nil) && | |
(selectedItem.subAdministrativeArea != nil || selectedItem.administrativeArea != nil) ? ", " : "" | |
// put a space between "Washington" and "DC" | |
let secondSpace = (selectedItem.subAdministrativeArea != nil && | |
selectedItem.administrativeArea != nil) ? " " : "" | |
let addressLine = String( | |
format:"%@%@%@%@%@%@%@", | |
// street number | |
selectedItem.subThoroughfare ?? "", | |
firstSpace, | |
// street name | |
selectedItem.thoroughfare ?? "", | |
comma, | |
// city | |
selectedItem.locality ?? "", | |
secondSpace, | |
// state | |
selectedItem.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].placemark | |
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].placemark | |
handleMapSearchDelegate?.dropPinZoomIn(placemark: selectedItem) | |
dismiss(animated: true, completion: nil) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment