Проблема в том, что удаление аннотации отключает пользовательскую кнопку аннотации для 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, также проверял объекты меток, при новом поиске новое местоположение - результат).