Как закрыть выноску для MKnnotation в MKMapView

У меня есть MKMapView, у которого есть несколько аннотаций. Выбор штифта отображает выноску и нажатие на аксессуар вызывает новый стек управления представлением в стеке. Однако, когда я возвращаюсь из этого нового VC, выноска остается открытым. Как его закрыть?

Я пробовал

if([[myMapView selectedAnnotations] count] > 0)
{
    //deselect that annotation
    [myMapView deselectAnnotation:[[myMapView selectedAnnotations] objectAtIndex:0] animated:NO];
}

но это не работает. Выбранные аннотации имеют единственную запись в массиве, поэтому она входит в этот оператор, но выноска не закрывается.

Нужно ли добавить что-то в мою реализацию MKAnnotation или мой MKPinAnnotationView?

Ответы

Ответ 1

Объекты в selectedAnnotations являются экземплярами MKAnnotation

NSArray *selectedAnnotations = mapView.selectedAnnotations;
for(id annotation in selectedAnnotations) {
    [mapView deselectAnnotation:annotation animated:NO];
}

Ответ 2

Если вы хотите придерживаться документации по набору карт.

for (NSObject<MKAnnotation> *annotation in [mapView selectedAnnotations]) {
    [mapView deselectAnnotation:(id <MKAnnotation>)annotation animated:NO];
}

Ответ 3

func mapView(mapView: MKMapView, annotationView view: MKAnnotationView,
             calloutAccessoryControlTapped control: UIControl)
{
    let pin = view.annotation
    mapView.deselectAnnotation(pin, animated: false)
    performSegueWithIdentifier("Next VC Segue", sender: nil)
}

Отмените выделение аннотации перед тем, как переходить к новому контроллеру представления. Таким образом, он исчезнет, ​​когда вы вернетесь.

Ответ 4

Вместо хорошего решения в представлении viewWillAppear работает следующий хакерский подход: анимированный

    for( MyMapAnnotation *aMKAnn in  [myMapView annotations])
    {
        //dodgy select then deselect each annotation
        [myMapView selectAnnotation:aMKAnn animated:NO];
        [myMapView deselectAnnotation:aMKAnn animated:NO];
    }

у выбранного массива Annotations есть 1 значение, но отмена этого значения по-прежнему не закрыла вызов? Поэтому я просто перебираю все аннотации и выбираю и снимаю выделение. У меня не так много аннотаций, так что, возможно, не так уж плохо, что производительность удалась?

Я был бы признателен за элегантное решение, если у кого-то есть лучшие идеи?

Ответ 5

Когда вы отскакиваете контакт, выносок должен уходить...

Ответ 6

- (void)deselectAllAnnotations
{

    NSArray *selectedAnnotations = [self.mapViewObj.mapView selectedAnnotations];
    for (int i = 0; i < [selectedAnnotations count]; i++) {
        [self.mapViewObj.mapView deselectAnnotation:[selectedAnnotations objectAtIndex:i] animated:NO];
    }

}

Это может помочь вам в решении вашей проблемы.

Ответ 7

стриж

Закрыть (отменить выбор) все аннотации программно...

mapView.selectedAnnotations.forEach({ mapView.deselectAnnotation($0, animated: false) })