ios swift2 mkmapview mkannotationview

ios - ¿Por qué no se llama a ViewForAnnotation?



swift2 mkmapview (2)

Encontré este problema de vez en cuando. Y encontré que a veces necesitas llamar a showAnnotations:animated: manualmente así:

mapView.showAnnotations(mapView.annotations, animated: true)

Sé que esta pregunta se ha realizado varias veces, sin embargo, todas las respuestas parecen ligeramente diferentes de lo que está sucediendo en mi aplicación.

Tengo entendido que la función viewForAnnotation se invoca una vez que mapView tiene su delegado configurado en ViewController en el que se muestra Y se agrega una anotación al mapa cuando mapView se desplaza para que se muestre dentro de la región mapView.

Actualmente tengo un viewController (mainVC) principal que contiene un MKMapView ( mapView ) Este control de vista controla cuatro mapas diferentes para que se muestren en mapView.

func moveViews(sender:Int) { // This function handles which button on the Segmented Control was clicked and the loads the appropriate map into the mapView (passed as a para removeAnnotationsAndOverlays() // ~~~ if sender == 0 { // First Map was selected let map1VC = map1VC() map1VC.loadMap1View(mapView) map1VC.centerMapOnLocation() } else if sender == 1 { // Second Map was selected let map2VC = map2VC() map2VC.loadMap2View(mapView) } else if sender == 2 { // Third Map was selected let map3VC = map3VC() map3VC.loadMap3View(mapView) } else if sender == 3 { // Fourth Map was selected let map4VC = map4VC() map4VC.loadMap4View(mapView) } else { // Load First Map as default let map1VC = map1VC() map1VC.loadMap1View(mapView) map1VC.centerMapOnLocation() } }

Hay varias clases diferentes que controlan la funcionalidad de cada uno de los diferentes mapas:

  1. Mapa 1: muestra una combinación de MKPolylines y Custom Annotations (hereda de MKAnnotation) que se leen de un plist. ¡Esto funciona genial!
  2. Mapa 2: muestra varios MKPolylines leídos de un plist - ¡Esto funciona genial!
  3. Mapa 3: muestra varios MKPolylines leídos de un plist - ¡Esto funciona genial!
  4. Mapa 4: debe mostrar varias anotaciones personalizadas, ¡esto NO FUNCIONA!

Esto es lo que está sucediendo con el Mapa 4:

  • MKMapView se está cargando correctamente

    var mapView: MKMapView = MKMapView() // declared as a global variable/object inside the map4VC() // Initial function to set up Map // Think of this function as the "override func viewDidLoad() {}" func loadMap4View(mV: MKMapView) { // This connects the parameter passed (mV) and sets it as the delegate for the mapView used throughout this file // In other words, it allows the mapView on the MainVC to use all of the code in this file to handle different actions mapView = mV mapView.delegate = self let initialLocation = CLLocation(latitude: 50.3603125, longitude: 2.794017) // calculates the region you''ll look at on the screen let coordinateRegion = MKCoordinateRegionMakeWithDistance(initialLocation.coordinate, regionRadius, regionRadius) // sets the region of the map mapView.setRegion(coordinateRegion, animated: true) //addPins() // This can use a custom function to load all of the Pins //mapView.addAnnotations(coords.allLocations!) // This line also works to add all of the individual pins mapView.addAnnotation(coords.allLocations![2]) // This adds one single Pin

    }

  • establecer el delegado de mapView en la clase actual (mapView.delegate = self)

  • se acerca a la ubicación correcta (mapView.setRegion (coordinateRegion, animated: true))
  • la clase lee desde un plist y (utilizando una clase auxiliar) construye una matriz de MKAnnotations personalizadas (CemAnno)

  • Las ubicaciones se almacenan en una matriz de CemAnno llamada allLocations:

    var allLocations: [CemAnno]? = [] // This is declared in the helper class along with a bunch of other stuff that grabs all of the information from a plist class CemAnno: NSObject, MKAnnotation { var coordinate: CLLocationCoordinate2D var title: String? var casualties: String? var visitInfo: String? var histInfo: String? var region: String? init(title: String, coordinate: CLLocationCoordinate2D, region: String, casualties: String, visitInfo: String, histInfo: String) { self.coordinate = coordinate self.title = title self.region = region self.casualties = casualties self.visitInfo = visitInfo self.histInfo = histInfo }

    }

    // This builds an object inside the the map4VC() class called coords that holds all of the information collected from the plist var coords = BuildCoordinates(filename: "Coordinate")

  • agrega cada uno de ellos al mapa (mapView.addAnnotations) y se muestran como pins (se muestran) mapView.addAnnotation (coords.allLocations! [2]) // Esto agrega una sola Anotación de Pin (que funciona) pero nunca llama a la función viewForAnnotation

Esto funciona, sin embargo, estoy tratando de personalizar las anotaciones que se muestran pero la función ViewForAnnotation nunca se llama ????

// This function is NEVER called func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { // Define a reuse identifier. This is a string that will be used to ensure we reuse annotation views as much as possible. let identifier = "CemAnno" // Check whether the annotation we''re creating a view for is one of our CemAnno objects. if annotation.isKindOfClass(CemAnno.self) { print("correct class") //let anno = annotation as! CustomAnnotation // Try to dequeue an annotation view from the map view''s pool of unused views. var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) if annotationView == nil { print("no reusable view") // If it isn''t able to find a reusable view, create a new one using MKPinAnnotationView and sets its canShowCallout property to be true. This triggers the popup with the name. annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView!.canShowCallout = true // Create a new UIButton using the built-in .Custom type. This is so we can add an image to the button. let btn = UIButton(type: .DetailDisclosure) //btn.setImage(anno.image, forState: .Normal) annotationView!.rightCalloutAccessoryView = btn } else { print("reusing a view") // If it can reuse a view, update that view to use a different annotation. annotationView!.annotation = annotation } return annotationView } // If the annotation isn''t from a CustomClass, it must return nil so iOS uses a default view. return MKPinAnnotationView() }

Intenté agregar la ubicación de un marcador dentro de la región de vista actual del mapa, pero ViewForAnnotation nunca se activa. Intenté agregar la ubicación del pin fuera de la región de vista actual del mapa, pero la ViewForAnnotation nunca se activa. Pensé que debería ser la que funciona, y mientras "desplazo" el mapa y aparece dentro del región de vista actual que debe activar la función, pero no (debo notar que el pin se muestra y aparece en el mapa).

Esto hace que no pueda personalizar el pin que me gustaría hacer .

Estoy usando la misma técnica que el Mapa 1, que funciona perfectamente bien, pero por alguna razón el ViewForAnnotation nunca se llama dentro de Map 4.

¡Cualquier sugerencia sería muy apreciada!


Lo siento pero no puedo ver la declaración de su controlador de vista mainVC : ¿su controlador implementa MKMapViewDelegate ?

import MapKit class mainVC: UIViewController, MKMapViewDelegate { ... }

EDIT 1: compruebe también si en su controlador de vista en su guión gráfico si el delegado está vinculado con su controlador de esta manera:

simplemente haga clic derecho en su mapView.