映射注释search

我遵循了一个关于在mapViewsearchannotations以及在MKLocalSearchsearch世界的方法的如何search位置使用苹果 MKLocalSearch

但是,我不想用MKLocalSearch进行search,而是search我自己的annotations ,例如我自己添加了这些annotations

 let LitzmanLocation = CLLocationCoordinate2DMake(32.100668,34.775192) // Drop a pin let Litzman = MKPointAnnotation() Litzman.coordinate = LitzmanLocation Litzman.title = "Litzman Bar" Litzman.subtitle = "נמל תל אביב 18,תל אביב" mapView.addAnnotation(Litzman) let ShalvataLocation = CLLocationCoordinate2DMake(32.101145,34.775163) // Drop a pin let Shalvata = MKPointAnnotation() Shalvata.coordinate = ShalvataLocation Shalvata.title = "Shalvata" Shalvata.subtitle = "האנגר 28,נמל תל אביב" mapView.addAnnotation(Shalvata) let MarkidLocation = CLLocationCoordinate2DMake(32.074961,34.781679) // Drop a pin let Markid = MKPointAnnotation() Markid.coordinate = MarkidLocation Markid.title = "Markid" Markid.subtitle = "אבן גבירול 30,תל אביב" mapView.addAnnotation(Markid) 

这是我的代码:

MapViewController.Swift:

 import UIKit import MapKit import CoreLocation protocol HandleMapSearch { func dropPinZoomIn(placemark:MKPlacemark) } class MapViewController: UIViewController,MKMapViewDelegate, CLLocationManagerDelegate,UISearchBarDelegate{ @IBOutlet var mapView: MKMapView! var resultSearchController:UISearchController? = nil var selectedPin:MKPlacemark? = nil @IBAction func MapSearchController(sender: AnyObject) { resultSearchController!.hidesNavigationBarDuringPresentation = false self.resultSearchController!.searchBar.delegate = self presentViewController(resultSearchController!, animated: true, completion: nil) self.resultSearchController!.searchBar.barTintColor = UIColor.blackColor() self.resultSearchController!.searchBar.placeholder = "חפש ברים" self.resultSearchController!.dimsBackgroundDuringPresentation = true self.resultSearchController!.searchBar.sizeToFit() } override func viewDidLoad() { super.viewDidLoad() let locationSearchTable = storyboard!.instantiateViewControllerWithIdentifier("LocationSearchTable") as! LocationSearchTable resultSearchController = UISearchController(searchResultsController: locationSearchTable) resultSearchController?.searchResultsUpdater = locationSearchTable locationSearchTable.mapView = mapView locationSearchTable.handleMapSearchDelegate = self } } } extension MapViewController: HandleMapSearch { func dropPinZoomIn(placemark:MKPlacemark){ // cache the pin selectedPin = placemark // clear existing pins mapView.removeAnnotations(mapView.annotations) let annotation = MKPointAnnotation() annotation.coordinate = placemark.coordinate annotation.title = placemark.name if let city = placemark.locality, let state = placemark.administrativeArea { annotation.subtitle = "(city) (state)" } mapView.addAnnotation(annotation) let span = MKCoordinateSpanMake(0.05, 0.05) let region = MKCoordinateRegionMake(placemark.coordinate, span) mapView.setRegion(region, animated: true) } } 

LocalSearchTable.Swift:

 import UIKit import MapKit class LocationSearchTable : UITableViewController { var matchingItems:[MKMapItem] = [] var mapView: MKMapView? = nil var handleMapSearchDelegate:HandleMapSearch? = nil 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 updateSearchResultsForSearchController(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.startWithCompletionHandler { 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, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("MapSearchCell")! let selectedItem = matchingItems[indexPath.row].placemark cell.textLabel?.text = selectedItem.name cell.detailTextLabel?.text = parseAddress(selectedItem) return cell } } extension LocationSearchTable { override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let selectedItem = matchingItems[indexPath.row].placemark handleMapSearchDelegate?.dropPinZoomIn(selectedItem) dismissViewControllerAnimated(true, completion: nil) } } 

因此,创build一个注释对象的数组,并将其保存在一个实例variables中。 我们称之为annotationsArray

那么你可以devise一个用户界面,让用户inputsearch条件。 假设你只search标题。 那么你可以使用:

 let titleMatches = annotationsArray.filter{$0.title == titleToMatch} 

然后使用addAnnotations()函数将过滤后的批注集显示到映射中。 (注意复数)