Цель C - иметь только один контакт за раз? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть 2 разных набора выводов поверх вида карты. Сначала отображается один контакт, и это местоположение пользователя, затем при поиске местоположения в строке поиска появляется несколько контактов в зависимости от местоположения. Я хочу, чтобы один пин показывался за раз. После поиска местоположения контакт местоположения пользователя должен исчезнуть, а после выбора одного из нескольких найденных контактов, остальные должны исчезнуть.

Вот мой код:

 #import "UbicacionVC.h"
 #import "SWRevealViewController.h"
 #import <MapKit/Mapkit.h>
 #import "Location.h"


 @interface UbicacionVC ()

 @end

 @implementation UbicacionVC
 @synthesize mapView;

 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     [self inicializarComponentes];
     self.mapView.delegate = self;
     self.searchBar.delegate = self;
 }



 - (void)didReceiveMemoryWarning {
     [super didReceiveMemoryWarning];
     // Dispose of any resources that can be recreated.
 }

 - (void)inicializarComponentes {
     [self.btnContinuar.layer setCornerRadius:20.0f];
     [self.btnCancelar.layer setCornerRadius:20.0f];

     ////
     UITapGestureRecognizer *gestureMenu = [[UITapGestureRecognizer                                                   alloc] init];
     [gestureMenu addTarget:self.revealViewController                                              action:@selector(revealToggle:)];
     [gestureMenu setCancelsTouchesInView:NO];
     [self.btnLeftMenu addGestureRecognizer:gestureMenu];

     [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
////
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    [self->locationManager requestWhenInUseAuthorization];

[locationManager startUpdatingLocation];



 }



 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
     NSLog(@"OldLocation %f %f", oldLocation.coordinate.latitude, oldLocation.coordinate.longitude);
     NSLog(@"NewLocation %f %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
     CLLocationDegrees lat = newLocation.coordinate.latitude;
     CLLocationDegrees lon = newLocation.coordinate.longitude;
     CLLocation * location = [[CLLocation alloc]initWithLatitude:lat longitude:lon];
     self.viewRegion =      MKCoordinateRegionMakeWithDistance(location.coordinate, 500, 500);
[self.mapView setRegion:self.viewRegion];


 }


 -(void)localSearch:(NSString*)searchString{

     [self.mapView setRegion:self.viewRegion];

     MKLocalSearchRequest * request = [[MKLocalSearchRequest alloc] init];
     request.naturalLanguageQuery = [searchString lowercaseString];
     request.region = self.viewRegion;

     MKLocalSearch* search = [[MKLocalSearch alloc] initWithRequest:request];
     [search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {

         if([response.mapItems count] == 0){
        NSLog(@"No matches \n");
    }
         else{
             for(MKMapItem * item in response.mapItems){
                 Location * pin = [[Location alloc] initWith:item.placemark.title andSubtitle:item.phoneNumber andCoordinate:item.placemark.coordinate andImageName:@"" andURL:item.url.absoluteString];
                 [self.mapView addAnnotation:pin];


        }
    }

}];

 }

 #pragma mark UISearchBarDelegate

 -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{

     [searchBar resignFirstResponder];
     [self.mapView removeAnnotations:[self.mapView annotations]];
     [self localSearch:searchBar.text];

 }

 #pragma mark MKMapViewDelegate

 -(MKAnnotationView*)mapView:(MKMapView*)sender viewForAnnotation:          (id<MKAnnotation>)annotation{

     static NSString* identifier = @"reusablePin";

     MKAnnotationView * aView = [sender dequeueReusableAnnotationViewWithIdentifier:identifier];
     if(!aView){

         aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
         aView.canShowCallout = YES;
     }

     aView.annotation = annotation;
     return aView;
 }


 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
 {

          NSLog(@"%@",view.annotation.title);

          NSLog(@"%@",view.annotation.subtitle);


 }

1 Ответ

0 голосов
/ 28 июня 2018

Я хочу, чтобы по одному выводу отображался за раз.

Как насчет break; в цикле?

for(MKMapItem * item in response.mapItems){
    Location * pin = [[Location alloc] initWith:item.placemark.title andSubtitle:item.phoneNumber andCoordinate:item.placemark.coordinate andImageName:@"" andURL:item.url.absoluteString];
    [self.mapView addAnnotation:pin];

    // one pin showed
    break;
}

Как только вы выполните поиск местоположения, пин-код пользователя должен исчезнуть, и как только вы выберете один из нескольких найденных контактов, остальные должны исчезнуть.

Вы можете использовать didSelectAnnotationView метод.

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
  // once you select one of the multiple pins, the others should disappear.
  for (MKPointAnnotation *annotation in mapView.annotations) {
    if (view.annotation != annotation) {
        [mapView removeAnnotation:annotation];
        NSLog(@"yes!!");
    }
  }
}
...