Метод всплывающей кнопки пользовательской аннотации не вызывается после удаления предыдущей аннотации

Проблема в том, что удаление аннотации отключает пользовательскую кнопку аннотации для rightCalloutAccessoryView.

При нажатии пользовательской кнопки вызывается метод протокола mapView:annotationView:calloutAccessoryControlTapped, но не метод отправителя для пользовательской кнопки. Первая добавленная аннотация на карту работает нормально, проблема начинается с инициализации второй аннотации.

Вот код:

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBarText {
      [searchBarText resignFirstResponder];
      [self.searchTable dismissViewControllerAnimated:YES completion:nil];

      CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    //Geocoding search bar text (adress).
     [geocoder geocodeAddressString:searchBarText.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
         if (error) {
             NSLog(@"Error with geocoding: %@", error);
        } else {
             //To remove previous annotation from MapView using its reference.
           if (self.previousAnnotation != nil) {

             [self.mapView removeAnnotation:self.previousAnnotation];
            self.previousAnnotation = nil;

            //To invoke result as the placemark object.
            CLPlacemark *placemark = placemarks.firstObject;
            //Adjusted region setup and data.
            MKCoordinateRegion region = MKCoordinateRegionMake(placemark.location.coordinate, MKCoordinateSpanMake(0.01, 0.01));
            MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:region];
            [self.mapView setRegion:adjustedRegion animated:YES];

            CustomAnnotation *customAnnotation = [[CustomAnnotation alloc] initWithTitle:placemark.name andLocation:CLLocationCoordinate2DMake(region.center.latitude, region.center.longitude)];

            [self.mapView addAnnotation:customAnnotation];

            //To save reference of newly added annotation.
            self.previousAnnotation = customAnnotation;

        } else if (self.previousAnnotation == nil) {

            //To invoke result as the placemark object.
            CLPlacemark *placemark = placemarks.firstObject;
            //Adjusted region setup and data.
            MKCoordinateRegion region = MKCoordinateRegionMake(placemark.location.coordinate, MKCoordinateSpanMake(0.01, 0.01));
            MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:region];
            [self.mapView setRegion:adjustedRegion animated:YES];

            CustomAnnotation *customAnnotation = [[CustomAnnotation alloc] initWithTitle:placemark.name andLocation:CLLocationCoordinate2DMake(region.center.latitude, region.center.longitude)];

            [self.mapView addAnnotation:customAnnotation];

            //To save reference of newly added annotation.
            self.previousAnnotation = customAnnotation;
        }
    }
}];
}

Логика вроде в порядке. Если я инициализирую аннотации с помощью приведенного ниже кода, проблем не возникает, я нажимаю кнопку, и метод отправки кнопки вызывается с каждой новой аннотацией.

            //To invoke result as the placemark object.
            CLPlacemark *placemark = placemarks.firstObject;
            //Adjusted region setup and data.
            MKCoordinateRegion region = MKCoordinateRegionMake(placemark.location.coordinate, MKCoordinateSpanMake(0.01, 0.01));
            MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:region];
            [self.mapView setRegion:adjustedRegion animated:YES];

            CustomAnnotation *customAnnotation = [[CustomAnnotation alloc] initWithTitle:placemark.name andLocation:CLLocationCoordinate2DMake(region.center.latitude, region.center.longitude)];

            [self.mapView addAnnotation:customAnnotation];

Кажется, проблема существует между удалением аннотации и инициализацией новой аннотации, но я не могу ее понять.

ИЗМЕНИТЬ (подробнее о проблеме)

При представлении второй аннотации на карте кнопка выноски не вызывает ее метод (даже при обнаружении касания). Так, например:

Я ищу адрес1, нажимаю пользовательскую кнопку выноски, вызывается метод пользовательской кнопки.

Я ищу адрес2, выноска адреса1 корректно удаляется, на карте появляется новая выноска адрес2 с правильными координатами, но пользовательская кнопка остается в выбранном состоянии, и нажатие на нее не вызывает ее метод.

ИЗМЕНИТЬ 2

Удаление аннотаций корректно (новое заменяет старое, проверял логированием self.mapView.annotations, также проверял объекты меток, при новом поиске новое местоположение - результат).


person Filip    schedule 27.06.2016    source источник
comment
вы добавляете обе аннотации в одно и то же место, никого не удаляя   -  person Anjali Bhimani    schedule 27.06.2016


Ответы (1)


Хорошо, я понял это.

Проблема заключалась в том, что после удаления аннотации представление аннотации ставится в очередь для последующего повторного использования (согласно справочнику по классу MKMapView). Все, что вам нужно сделать, это использовать метод dequeueReusableAnnotationViewWithIdentifier: после вызова removeAnnotation:.

         if (self.previousAnnotation != nil) {

            [self.mapView removeAnnotation:self.previousAnnotation];
            //Set it nil before attaching it with new reference.
            self.previousAnnotation = nil;

            //To invoke result as the placemark object.
            CLPlacemark *placemark = placemarks.firstObject;

            //Adjusted region setup and data.
            MKCoordinateRegion region = MKCoordinateRegionMake(placemark.location.coordinate, MKCoordinateSpanMake(0.01, 0.01));
            MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:region];
            [self.mapView setRegion:adjustedRegion animated:YES];

            CustomAnnotation *customAnnotation = [[CustomAnnotation alloc] initWithTitle:placemark.name andLocation:CLLocationCoordinate2DMake(region.center.latitude, region.center.longitude)];

            [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomAnnotation"];
            [self.mapView addAnnotation:customAnnotation];

            //To save reference of newly added annotation.
            self.previousAnnotation = customAnnotation;
person Filip    schedule 28.06.2016