0

in my code, first i am showing current location and static location of desired place eg. Mobius fit. but when i am searching the same ie. mobius fit it is displaying two pins close to each other of mobius fit location, instead of one. how to show only one pin on search? My code:

 class LocationMapViewController:  UIViewController,CLLocationManagerDelegate, MKMapViewDelegate,UISearchBarDelegate,UIGestureRecognizerDelegate{

            var searchController:UISearchController!
            var annotation:MKAnnotation!
            var localSearchRequest:MKLocalSearchRequest!
            var localSearch:MKLocalSearch!
            var localSearchResponse:MKLocalSearchResponse!
            var error:NSError!
            var pointAnnotation:MKPointAnnotation!
            var pinAnnotationView:MKAnnotationView!
            let manager = CLLocationManager()
            @IBOutlet var MKView: MKMapView!
            @IBOutlet var searchBarButton: UISearchBar!


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
                let location = locations[0]
                let span:MKCoordinateSpan = MKCoordinateSpanMake(0.01, 0.01)
                let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
                let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span)
                MKView.setRegion(region, animated: true)
                self.MKView.showsUserLocation = true
            }



//Here im displaying two static location and current location


            let regionRadius: CLLocationDistance = 10000

            override func viewDidLoad() {
                self.searchBarButton.delegate = self
                super.viewDidLoad()
                manager.delegate = self
                manager.desiredAccuracy = kCLLocationAccuracyBest
                manager.requestWhenInUseAuthorization()
                manager.startUpdatingLocation()

                manager.stopMonitoringSignificantLocationChanges()
                let initialLocation = CLLocation(latitude: 37.539624, longitude: -122.062990)

                self.MKView.showsUserLocation = true
                self.MKView.isZoomEnabled = true
                centerMapOnLocation(location: initialLocation)
                let myAnnotation: MKPointAnnotation = MKPointAnnotation()
                myAnnotation.coordinate = CLLocationCoordinate2DMake(initialLocation.coordinate.latitude, initialLocation.coordinate.longitude);
                myAnnotation.title = "Fit@PRC"
                myAnnotation.subtitle = "Newark, CA 94560"
                MKView.addAnnotation(myAnnotation)
                MKView.selectAnnotation(myAnnotation, animated: true)

    let MobiusLocation = CLLocation(latitude: 37.454904, longitude: -122.228262)

                self.MKView.showsUserLocation = true
                self.MKView.isZoomEnabled = true
                centerMapOnLocation(location: MobiusLocation)
                let mobiusAnnotation: MKPointAnnotation = MKPointAnnotation()
                mobiusAnnotation.coordinate = CLLocationCoordinate2DMake(MobiusLocation.coordinate.latitude, MobiusLocation.coordinate.longitude);
                mobiusAnnotation.title = "Mobius Fit"
                mobiusAnnotation.subtitle = "Redwood City,CA 94061"
                MKView.addAnnotation(mobiusAnnotation)
                MKView.selectAnnotation(mobiusAnnotation, animated: true)


            }

// this is my search function . how to clear previous pins on search ?

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

                searchBar.endEditing(true)
                //1
                searchBar.resignFirstResponder()

                if self.MKView.annotations.count != 0{
                    annotation = self.MKView.annotations[0]
                    self.MKView.removeAnnotation(annotation)
                }
                //2
                localSearchRequest = MKLocalSearchRequest()
                localSearchRequest.naturalLanguageQuery = searchBar.text
                localSearch = MKLocalSearch(request: localSearchRequest)
                localSearch.start { (localSearchResponse, error) -> Void in

                    if localSearchResponse == nil{
                        let alertController = UIAlertController(title: nil, message: "Place Not Found", preferredStyle: UIAlertControllerStyle.alert)
                        alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default, handler: nil))
                        self.present(alertController, animated: true, completion: nil)


                        return
                    }
                    //3
                    self.pointAnnotation = MKPointAnnotation()
                    self.pointAnnotation.title = searchBar.text
                    self.pointAnnotation.coordinate = CLLocationCoordinate2D(latitude: localSearchResponse!.boundingRegion.center.latitude, longitude:     localSearchResponse!.boundingRegion.center.longitude)


                    self.pinAnnotationView = MKPinAnnotationView(annotation: self.pointAnnotation, reuseIdentifier: nil)
                    self.MKView.centerCoordinate = self.pointAnnotation.coordinate

                    self.MKView.addAnnotation(self.pinAnnotationView.annotation!)

                    self.manager.stopUpdatingLocation()
                    self.manager.stopMonitoringSignificantLocationChanges()


                }
            }
Nishant Bhindi
  • 2,242
  • 8
  • 21
  • let allAnnotations = self.mapView.annotations self.yourMapVieww.removeAnnotations(allAnnotations) you must search on search google how to remove annotations before posting questions. – Gagan_iOS Jun 21 '17 at 05:29
  • Possible duplicate of [How do I remove all annotations from MKMapView except the user location annotation?](https://stackoverflow.com/questions/10865088/how-do-i-remove-all-annotations-from-mkmapview-except-the-user-location-annotati) – bestiosdeveloper Jun 21 '17 at 05:30

1 Answers1

0

UPDATED

You have to remove previously added Annotation before adding new one So you can achieve this with these two ways

First: remove your specific annotation before adding new one

for  annotation in mapView.annotations
{
    if(annotation.title! == "yourTitleAnnotationToRemove"){
    mapView.removeAnnotation(annotation);
        break
    }
}

Second: remove all notation before adding new one by

let allAnnotations = mapView.annotations
mapView.removeAnnotations(allAnnotations)
Vikky
  • 914
  • 1
  • 6
  • 16