2009-07-28 13 views
14

Mam MKMapView, który ma wiele adnotacji. Wybranie pinezki powoduje wyświetlenie objaśnienia, a naciśnięcie tego elementu powoduje dodanie nowego kontrolera view na stercie. Jednak po ponownym naciśnięciu nowego VC objaśnienie jest nadal otwarte. Jak to zamknąć?Jak zamknąć objaśnienie dla MKAnnotation w MKMapView

Próbowałem

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

ale to nie działa. WybraneAnnotacje mają pojedynczy wpis w tablicy, więc wchodzi w tę instrukcję, ale objaśnienie nie jest zamknięte.

Czy muszę dodać coś do mojej implementacji MKAnnotation lub mojego MKPinAnnotationView?

Odpowiedz

29

Obiekty w selectedAnnotations są przypadki MKAnnotation

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

Nie jestem pewien, czy zmieniły SDK, ponieważ odpowiedziałeś na to, ale selectedAnnotations są rzeczywiście adnotacjami, a nie instancjami MKAnnotationView. – jowie

+1

jowie ma rację (ale nie jestem pewien, jaka była sytuacja w 2009 r., Kiedy af. Odpowiedział). Muszę napisać kod w ten sposób, aby działał: for (adnotacja w wybranych adnotacjach) { [_mapView deselectAnnotation: animacja adnotacji: NIE]; } –

+0

Mam tylko jedną adnotację w [mapView selectedAnnoations], ale callOut jest nadal widoczny – Misha

0

Kiedy reclick kołek objaśnienie powinien odejść ...

+3

dziękuję, ale muszę je programowo zamknąć – joneswah

1

Zamiast ładnym rozwiązanie następujących hacky podejście działa w viewWillAppear: animowane

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

tablica selectedAnnotations ma 1 wartość, ale odznaczenie tej wartości nadal nie zamknęło wywołania? Dlatego po prostu przeglądam wszystkie adnotacje, zaznaczam i odznaczam. Nie mam wielu adnotacji, więc prawdopodobnie nie jest tak źle.

Byłbym wdzięczny za eleganckie rozwiązanie, jeśli ktoś ma lepsze pomysły?

14

w przypadku chcesz trzymać się z dokumentacją zestawu map.

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

Świetnie. Chciałem automatycznie objaśnić objaśnienia po powrocie do mapy z dowolnego innego ekranu oprócz widoku szczegółów dla tej adnotacji, więc dodałem zmienną o nazwie cerrarCallout i tę metodę do mojego kontrolera widoku - (void) viewWillAppear: (BOOL) animowany {if (cerrarCallout) {dla (NSObject * adnotacja w [self.mapView selectedAnnotations]) {[self.appview deselectAnnotation: (id ) animacja adnotacji: NO]; }} cerrarCallout = YES; } Dodano również cerrarCallout = YES w viewDidLoad i cerrarCallout = NO w gałęzi prepareForSegue kontrolki widoku szczegółów. – alvaro

0
- (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]; 
    } 

} 

To może pomóc w rozwiązaniu problemu.

2
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) 
} 

Odznacz adnotację tuż przed przejściem do nowego kontrolera widoku. W ten sposób zniknie, gdy wrócisz.