2015-03-26 9 views
5

Ho il seguente codice in Swift per aggiungere un MKPolyline a un MapView. XCode non mi dice che c'è un problema e, per quanto ho letto, dovrebbe funzionare.MKPolyLine non appare su MapView in Swift

sbocco per i MapView:

@IBOutlet weak var mapView: MKMapView! 

variabile per contenere le coordinate:

var coordinates: [CLLocationCoordinate2D] = [] 

ottenere le mie coordinate salvati da Core Data:

var contextMap = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext! 
var requestMap = NSFetchRequest(entityName: "Locations") 
let predMap = NSPredicate(format: "game = %d", passedGameNumber) 
requestMap.predicate = predMap 
requestMap.sortDescriptors = [NSSortDescriptor(key:"time", ascending: false)] 
    self.locationsList = contextMap.executeFetchRequest(requestMap, error: nil)! as [Locations] 

Aggiungi le coordinate da Core Data al mio nuovo array:

Creare la polilinea:

var polyLine = MKPolyline(coordinates: &coordinates, count: coordinates.count) 

Aggiungi la sovrapposizione:

self.mapView.addOverlay(polyLine, level: MKOverlayLevel.AboveRoads) 

aggiungerlo alla MapView:

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! { 
    if overlay.isKindOfClass(MKPolyline) { 
     // draw the track 
     let polyLine = overlay 
     let polyLineRenderer = MKPolylineRenderer(overlay: polyLine) 
     polyLineRenderer.strokeColor = UIColor.blueColor() 
     polyLineRenderer.lineWidth = 2.0 

     return polyLineRenderer 
    } 

    return nil 
} 

ho semplicemente ottenere un MapView vuoto. Posso stampare l'array di coordinate sulla console, quindi so che i dati sono stati aggiunti. Qualche idea?

+0

Il vostro viewController conforme al protocollo 'MKMapViewDelegate'? – zisoft

+0

L'uscita delegati della vista mappa è collegata al controller della vista? Dopo addOverlay, self.mapView.overlays.count dice 1? Il metodo rendererForOverlay viene effettivamente chiamato (inserisci un breakpoint o println lì)? Le coordinate sono valide/a ritroso (succede)? Non correlato, ma non dovrebbe 'per l'indice in 1 .. <' be' per indice in 0 .. <'? – Anna

+0

Grazie a entrambi. Anna, ho aggiunto il punto di interruzione e sembra che non venga chiamato. Potrebbe essere una domanda stupida, ma come posso risolverlo? Sono sicuro che sia semplice. Riguardo l'indice in 1 commento, mi stava dando un errore quando avevo 0 lì prima - che ora sembra funzionare con 1. –

risposta

6

Come postato nei commenti, il codice nella domanda andava bene. Semplicemente non stavo impostando il delegato.

mapView.delegate = self 
5

Il metodo di cui sopra sarà scritto come questo in Swift3:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 
     if overlay.isKind(of: MKPolyline.self) { 
      // draw the track 
      let polyLine = overlay 
      let polyLineRenderer = MKPolylineRenderer(overlay: polyLine) 
      polyLineRenderer.strokeColor = UIColor.blue 
      polyLineRenderer.lineWidth = 2.0 

      return polyLineRenderer 
     } 

     return MKPolylineRenderer() 
    } 
Problemi correlati