2014-07-02 10 views
14

Ho un ciclo di lavoro per impostare le annotazioni per gli elementi del titolo e dei sottotitoli per alcuni punti di dati di lavoro. Quello che voglio fare all'interno della stessa struttura del ciclo è impostare il colore del puntale su Viola invece che sul valore predefinito. Quello che non riesco a capire è quello che devo fare per toccare il mio theMapView per impostare il pin di conseguenza.Bloccato sull'utilizzo di MKPinAnnotationView() all'interno di Swift e MapKit

mio ciclo di lavoro e di alcuni tentativi di qualcosa ...

.... 
for var index = 0; index < MySupplierData.count; ++index { 

    // Establish an Annotation 
    myAnnotation = MKPointAnnotation(); 
    ... establish the coordinate,title, subtitle properties - this all works 
    self.theMapView.addAnnotation(myAnnotation) // this works great. 

    // In thinking about PinView and how to set it up I have this... 
    myPinView = MKPinAnnotationView();  
    myPinView.animatesDrop = true; 
    myPinView.pinColor = MKPinAnnotationColor.Purple; 

    // Now how do I get this view to be used for this particular Annotation in theMapView that I am iterating through??? Somehow I need to marry them or know how to replace these attributes directly without the above code for each data point added to the view 
    // It would be nice to have some kind of addPinView. 

} 

risposta

35

è necessario implementare il metodo delegato viewForAnnotation e restituire un MKAnnotationView (o sottoclasse) da lì.
Questo è proprio come in Objective-C - l'SDK sottostante funziona allo stesso modo.

Rimuovere la creazione MKPinAnnotationView dal for ciclo che aggiunge le annotazioni e implementare il metodo delegato anziché.

Ecco un esempio di implementazione del metodo viewForAnnotation delegato a Swift:

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

    if annotation is MKUserLocation { 
     //return nil so map view draws "blue dot" for standard user location 
     return nil 
    } 

    let reuseId = "pin" 

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView 
    if pinView == nil { 
     pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
     pinView!.canShowCallout = true 
     pinView!.animatesDrop = true 
     pinView!.pinColor = .Purple 
    } 
    else { 
     pinView!.annotation = annotation 
    } 

    return pinView 
} 
+0

Brillante - Tks. L'ho lasciato cadere e ha funzionato. Ho solo bisogno di vedere un equivalente Swift in quanto non faccio molti obj C. Un punto minore in quanto il compilatore ha lanciato un avvertimento per usare il trattino basso nella riga: func mapView (_ mapView: MKMapView!, ... L'avviso era "Extraneous" _ "in paramter 'mapView' non ha nome argomento parola chiave – Kokanee

+0

@Anna, hai un progetto di esempio disponibile? Sto sbattendo la testa contro il muro qui. Grazie – User4

+0

Non ho abbastanza rep per commentare, ma la funzione sopra funziona ancora eccetto che pinView! .pinColor non è ammortizzato. Dovrebbe leggere pinView! .pinTintColor = UIColor.purpleColor() – Lunarchaos42

Problemi correlati