mapView: didDeselectAnnotationView: метод делегата, вызываемый до фактического отмены выбора представления аннотации - PullRequest
2 голосов
/ 03 августа 2011

Я работаю с представлением карты, заполненным пользовательскими выводами. Когда пользователь нажимает где-то на карте, чтобы отменить выбор контакта, я хочу реализовать карту таким образом, чтобы вывод не отменялся (т. Е. Пользователи не могут отменить выбор выводов без выбора других выводов, поэтому всегда будет выбран хотя бы один вывод). ). Вот моя реализация метода didDeselectAnnotationView:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [mapView selectAnnotation:view.annotation animated:NO];
}

По сути, я пытаюсь повторно выбрать аннотацию. Однако, после некоторой отладки и печати на консоль, я понял, что представление аннотации на самом деле не отменяется, пока не завершится выполнение метода didDeselectAnnotationView: то есть порядок событий: пользователь нажимает где-то на карте, вызывается didDeselectAnnotationView: и завершает выполнение, представление аннотации фактически отменено). Кто-нибудь еще сталкивался с этой проблемой, или кто-нибудь знает другой способ применения поведения для карты, чтобы пользователи не могли отменить выбор контактов, не выбирая другие контакты, чтобы всегда был выбран один контакт?

Спасибо за помощь.

Ответы [ 5 ]

10 голосов
/ 03 августа 2011

Попробуйте отложить повторный выбор до завершения didDeselectAnnotationView:

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [self performSelector:@selector(reSelectAnnotationIfNoneSelected:) 
            withObject:view.annotation afterDelay:0];
}

- (void)reSelectAnnotationIfNoneSelected:(id<MKAnnotation>)annotation
{
    if (mapView.selectedAnnotations.count == 0)
        [mapView selectAnnotation:annotation animated:NO];
}
1 голос
/ 04 апреля 2015

РЕДАКТИРОВАТЬ: имейте в виду, что этот метод предотвращает выбор любых других контактов, которые были неизвестны при создании этого ответа. Скорее всего, это не ваше желаемое поведение.

Я знаю, что это старый вопрос, но принятый ответ не сработал для меня в iOS 8. Для меня сработало полное отключение UITapGestureRecognizer, который по умолчанию включен в MKMapView.

- (void)disableTapRecognizerForMapView:(MKMapView *)mapView {
    NSArray *a = [[self.mapView.subviews objectAtIndex:0] gestureRecognizers];

    for (id gesture in a)
        if ([gesture isKindOfClass:[UITapGestureRecognizer class]])
            [gesture setEnabled:NO];
}

Надеюсь, это поможет кому-то еще.

Ура!

0 голосов
/ 09 марта 2018

если вы добавляете жест для просмотра карты, попробуйте это:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

верните НЕТ, это работает

0 голосов
/ 07 июля 2017

Потрясающий ответ от Анны.Вот ответ в Swift 3 или 4: D

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    perform(#selector(MyViewController.reSelectAnnotationIfNoneSelected(_:)), with: view.annotation, afterDelay: 0)
}

func reSelectAnnotationIfNoneSelected(_ annotation: MKAnnotation) {
    if mapView.selectedAnnotations.count == 0 {
        mapView.selectAnnotation(annotation, animated: false)
    }
}
0 голосов
/ 07 мая 2012

У меня была похожая проблема, но наоборот.

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

Следующий код решил проблему и является небольшим изменением решения Анны.

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKPinAnnotationView *)view
{
   if ([view.annotation isKindOfClass:[MKUserLocation class]]) 
        return;

    [self performSelector:@selector(resetTableScroll:) 
           withObject:view.annotation afterDelay:.5];
    }



- (void)resetTableScroll:(id<MKAnnotation>)annotation{

    if (theMap.selectedAnnotations.count == 0)
    {
        NSIndexPath *position = [NSIndexPath indexPathForRow:0 inSection:0];
        [[self theTable] scrollToRowAtIndexPath:position atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }}
...