2014-11-03 17 views
10

Mi piacerebbe lavorare con un'annotazione dopo aver fatto clic. Ho consultato la documentazione di Apple e l'ho fatto su Google, ma non riesco a trovare il motivo per cui questo è diverso da come dovrebbe essere fatto. Fondamentalmente; Non capisco perché non un println("Pin clicked");didSelectAnnotationView non chiamato

?

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! 
{ 
    if !(annotation is MKPointAnnotation) { 

     return nil 
    } 

    let reuseId = "test" 

    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) 
    if anView == nil { 
     anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
     anView.canShowCallout = true 

    } 
    else { 
     anView.annotation = annotation 
    } 

    return anView 
} 
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) 
{ 
    println("Pin clicked"); 
} 
func setAnnotationPinOnMap(annotation : NSManagedObject) 
{ 

    var subject: AnyObject? = annotation.valueForKey("subject") 
    var desc: AnyObject? = annotation.valueForKey("desc") 
    var langitude: AnyObject? = annotation.valueForKey("langitude") 
    var longitude: AnyObject? = annotation.valueForKey("longitude") 
    println(annotation); 
    let pin = MKPointAnnotation() 

    let location = CLLocationCoordinate2D(
     latitude: longitude as CLLocationDegrees, 
     longitude: langitude as CLLocationDegrees 
    ) 
    println(location.longitude, location.latitude) 
    pin.setCoordinate(location) 
    pin.title = subject as String! 
    pin.subtitle = desc as String! 
    println(pin.coordinate.longitude) 
    viewForAnnotation(pin); 
    mapView.addAnnotation(pin) 
} 

Ho importato il kit di mappe e incluso il delegato della visualizzazione mappa.

+1

è 'delegate' del guarda la mappa set di proprietà? In caso contrario, il metodo delegato non verrà richiamato. Assicurati anche che il 'titolo' dell'annotazione (che è impostato su' subject') non sia vuoto o nullo. – Anna

+0

Due cose non correlate: 1) Quando si imposta 'posizione', la latitudine è impostata su longitudine e la longitudine è impostata su langitudine che sembra all'indietro. 2) La funzione viewForAnnotation come scritta è inutile. Restituisce una vista ma il codice non fa nulla e ** non è denominato correttamente come metodo delegato della vista mappa **. Deve essere chiamato 'func mapView (mapView: MKMapView !, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!' E il 'delegate' della vista mappa deve essere impostato. Non dovresti chiamarlo direttamente. – Anna

+0

Non ho impostato la mappa come delegato della vista. Ora l'ho impostato su: mapView.delegate = self. Ora, non vengono mostrati pin (in precedenza venivano mostrati i pin, ma non con l'evento click lanciato) – Kraishan

risposta

14

Per rispondere alla domanda originale, è probabile che il numero didSelectAnnotationView non sia stato chiamato perché la proprietà della vista mappa delegate non è stata impostata. Un'altra causa comune è se l'annotazione title è vuota.

Nella domanda aggiornata, i pin non verranno visualizzati nel modo in cui è implementato viewForAnnotation perché crea un MKAnnotationView ma non imposta la proprietà image. La proprietà image di un MKAnnotationView è nil per impostazione predefinita, quindi i pin sono lì ma invisibili.

Se si desidera visualizzare i perni rossi standard, sia:

  • non implementano il metodo viewForAnnotation delegato a tutti e la visualizzazione della mappa visualizzerà perni rossi di default.
  • Implementare il metodo delegato viewForAnnotation e crea un MKPinAnnotationView invece che visualizza automaticamente un'immagine "pin".

Quindi, o impostare il image a qualche immagine personalizzata pin:

anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
anView.canShowCallout = true 
anView.image = UIImage(named:"CustomImage") // <-- add this line 

o creare un MKPinAnnotationView invece e facoltativamente impostare il suo pinColor:

var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView 
if anView == nil { 
    anView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
    anView!.canShowCallout = true 
    anView!.animatesDrop = true 
    anView!.pinColor = .Purple // or Red or Green 
} 
else { 
    anView!.annotation = annotation 
} 
+0

Ciao Anna, grazie mille per una così grande risposta. Il mio problema (come giustamente sottolineato da voi) era che non ho impostato un titolo per la vista. Cosa succede se non voglio impostare un titolo? C'è qualche altra opzione? –

+0

Vlad, hai trovato una risposta alla tua domanda? Vorrei anche creare una visualizzazione personalizzata con un'etichetta. Il problema è che se imposto il titolo appare nella mia vista, ma anche a destra, accanto alla mia vista personalizzata –

+0

Il titolo vuoto lo ha risolto per me. Più specificamente, ho cancellato accidentalmente il "- (NSString *) title;" dichiarazione dal mio file .h. – Gazzini

3

Nel mio caso il problema era che i stava impostando la proprietà canShowCallout in SÌ, quindi se si imposta questa proprietà in SI

non viene chiamato. quando ho rimosso questa proprietà è stato chiamato il metodo.

annotationView = [[ClusterAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
annotationView.canShowCallout = YES; //try setting to NO or don't set. 
+0

'canShowCallout = false' per Swift risolto per me. Grazie :) – Sasho

1

Nel mio caso ho usato l'annotazione costume e la didSelectAnnotationView non era stato chiamato a causa della proprietà di immagini per l'annotazione custome era vuoto, così ho impostato per l'immagine e la didSelectAnnotationView ha iniziato ad essere chiamato.

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{ 
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
    if (self != nil) 
    { 
     DoctorCustomeAnnotation *mapItem = (DoctorCustomeAnnotation *)self.annotation; 

     // offset the annotation so it won't obscure the actual lat/long location 
     self.centerOffset = CGPointMake(100, 100.0); 
     self.backgroundColor = [UIColor redColor]; 
     PAImageView* avatarView = [[PAImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50) 
              backgroundProgressColor:[UIColor whiteColor] 
                 progressColor:[UIColor colorWithRed:0.092 green:0.383 blue:0.580 alpha:1.000]]; 
     [self addSubview:avatarView]; 
     self.image = [UIImage imageNamed:@"placeholder_male"]; 
     [avatarView setImageURL:@"http://www.straine.com/wp-content/uploads/2015/12/doctor.png"]; 
    } 
    return self; 
} 
1

Desidero aggiungere questo come commento alla risposta GOrozco58 ma non ho abbastanza reputazione per commentare.

GOrozco58 è giusto se si dispone di canShowCallout impostata su YES il didSelectAnnotation non sarà chiamato, se il titolo è pari a zero.

Se si desidera chiamare didSelectAnnotation e avere canShowCallout impostato su SÌ, assicurarsi di aggiungere un titolo.

+0

quindi ti faccio fare un rep! – eric

0

Il suggerimento di Anna del titolo dell'annotazione non assegnato era la risoluzione del mio problema. Mi ci è voluto un minuto per implementare questo e l'ho fatto nella funzione gestureRecognizer(). Qui è il mio esempio:

@objc func handleLongPress(_ gestureRecognizer : UIGestureRecognizer) { 
    if gestureRecognizer.state != .began { return } 
    print("Tap gesture recognized") 

    // Create the annotation 
    let touchPoint = gestureRecognizer.location(in: mapView) 
    let newCoordinate = self.mapView.convert(touchPoint, toCoordinateFrom:self.mapView) 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = newCoordinate 
    annotation.title = "placeholder" 

    // Add the annotation 
    mapView.addAnnotation(annotation) 
} 
1

Nell'ultima versione della Swift, la dichiarazione di metodo è cambiato da questo:

func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!) 

a questo:

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)