2009-07-28 21 views
14

Ho un MKMapView con un numero di annotazioni. Selezionando il pin viene visualizzato il callout e premendo l'accessorio si apre un nuovo viewcontroller sullo stack. Tuttavia quando torno da quel nuovo VC il callout è ancora aperto. Come lo chiudo?Come chiudere un callout per MKAnnotation in un MKMapView

ho cercato

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

, ma questo non funziona. L'Annotazioni selezionata ha una singola voce nell'array in modo che entri in questa istruzione ma il callout non viene chiuso.

Devo aggiungere qualcosa alla mia implementazione MKAnnotation o al mio MKPinAnnotationView?

risposta

29

Gli oggetti in selectedAnnotations sono casi di MKAnnotation

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

Non sono sicuro che abbiano cambiato l'SDK da quando hai risposto a questo, ma le note selezionate sono effettivamente annotazioni e non istanze di MKAnnotationView. – jowie

+1

jowie ha ragione (ma non sono sicuro di quale fosse la situazione nel 2009, quando af. Replicò). Ho bisogno di scrivere il codice come questo per farlo funzionare: for (id annotation in selectedAnnotations) { [_mapView deselectAnnotation: annotation animated: NO]; } –

+0

Ho solo un'annotazione in [mapView selectedAnnations] ma callOut è ancora visibile – Misha

0

Quando si rifate un singolo perno didascalia dovrebbe andare via ...

+3

grazie, ma ho bisogno di chiuderlo a livello di programmazione – joneswah

1

Al posto di una bella soluzione il seguente approccio hacky lavora nel viewWillAppear: animato

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

matrice selectedAnnotations ha 1 valore ma deselezionare quel valore non ha ancora chiuso la chiamata? Quindi faccio semplicemente scorrere tutte le annotazioni e selezionare e deselezionare. Non ho molte annotazioni, quindi probabilmente non è un cattivo risultato per le prestazioni?

Gradirei una soluzione elegante se qualcuno ha idee migliori?

14

Nel caso in cui si vuole attaccare con la documentazione mappa kit.

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

Grande. Volevo automatizzare i callout quando tornavo alla mappa da qualsiasi altra schermata tranne la vista dettagli per quell'annotazione, quindi ho aggiunto una variabile chiamata cerrarCallout e questo metodo al mio controller di visualizzazione - (void) viewWillAppear: (BOOL) animated {if (cerrarCallout) {per (NSObject * annotation in [self.mapView selectedAnnotations]) {[self.mapView deselectAnnotation: (id ) annotazione animata: NO]; }} cerrarCallout = YES; } Inoltre ha aggiunto cerrarCallout = YES in viewDidLoad e cerrarCallout = NO nel ramo di prepareForSegue del controllo della vista di dettaglio. – 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]; 
    } 

} 

Questo può aiutare a risolvere il tuo problema.

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

Deseleziona l'annotazione appena prima di passare al nuovo controller di visualizzazione. Così andrà via quando tornerai.

Problemi correlati