MKMapView no llama a los métodos de delegado

votos
10

En un UIViewController agrego un MKMapView a la vista controlada por el controlador.

- (void)viewDidLoad {
[super viewDidLoad];
CGRect rect = CGRectMake(0, 0, 460, 320);
map = [[MKMapView alloc] initWithFrame:rect];
map.delegate = self;
[self.view addSubview:map];
 }

Más tarde en el controlador tengo

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
     NSLog(@done.);
}

Listo nunca se imprime. Ninguno de los otros métodos delegados se llama como mapView: viewForAnnotation: uso un MKMapView en otra aplicación, pero esto parece ocurrir en cualquier aplicación nueva que haga. Alguien más ha visto este comportamiento?

EDITAR:

El problema parece ser cuando UIViewController se convierte en el delegado de MKMapView, una subclase directa de NSObject parece funcionar bien. Puedo trabajar de esta manera, todavía parece muy extraño ya que lo he hecho antes.

Publicado el 04/09/2009 a las 14:42
fuente por usuario
En otros idiomas...                            


10 respuestas

votos
8

Yo tenía el mismo problema: había asignado <MKMapViewDeledate> a mi controlador, y vinculado al delegado "propietario del archivo" en el Interface Builder, pero aún así mis métodos de delegado implementadas no fueron llamados.

La razón es que, dado que el IOS 4, los mapas se almacenan en caché, y cada vez que una aplicación mostrar un mapa en caché a continuación métodos tales como "mapViewDidFinishLoadingMap" no se llama. Restablecimiento de "contenidos y ajustes" en el simulador borra los mapas almacenados en caché y por lo tanto resuelve el problema.

Respondida el 15/01/2011 a las 19:06
fuente por usuario

votos
6

Un poco viejo, pero desde iOS 7 hay un nuevo método que podría funcionar. solucionado mi problema

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
Respondida el 14/06/2015 a las 22:48
fuente por usuario

votos
4

Tal vez tiene que ir a la IB y de control de arrastre desde el MKMapView a la vista conroller, a continuación, seleccione delegado para que sea un delegado ???

Respondida el 29/01/2010 a las 00:59
fuente por usuario

votos
1

He tenido un problema similar con los métodos de MKMapViewDelegate no ser llamados. Mi problema estaba poniendo el MKCoordinateRegionMakeWithDistance y regionThatFits en -viewDidLoad del controlador () quería mostrar sólo la región alrededor de mi casa y no empezar con la visión del mundo. Así que después de añadir anotaciones en viewDidLoad del controlador, empecé un temporizador. Cuando expire en un segundo, que Acercar en la región que quiera con las API anteriores y el fuego métodos de delegado. Sólo me hace un poco mareado y con tendencia a vomitar en mi iPad.

Ahora sólo tengo que lidiar con las advertencias de poca memoria maldito.

Respondida el 21/05/2010 a las 16:38
fuente por usuario

votos
1

tal vez bastante obvio, pero solo revisando:

¿Se ha asegurado de que su declaración de viewcontroller esté correctamente hecha? Algo como:

@interface YourViewController : UIViewController <MKMapViewDelegate>
Respondida el 04/09/2009 a las 16:02
fuente por usuario

votos
0

Mi problema es que me olvide de establecer la ubicación en el simulador. Ir a Simulator -> Debug -> Location -> Custom location...y los MKMapViewDelegatemétodos se empieza a llamar

Respondida el 04/04/2017 a las 06:19
fuente por usuario

votos
0

Tenía un problema similar en la construcción de XCode 6.1 para iOS 8.1, donde ninguno de los métodos MKMapViewDelegate se está llamando. En una segunda aplicación del código idéntico resultó en los métodos MKMapViewDelegate ser llamado como se esperaba.

En ViewController.m el delegado MAPview se estableció de la siguiente manera:

- (void)viewDidLoad {
    ...
    self.mapView.delegate = self;

En ViewController.h:

@interface myMapViewController : UIViewController <MKMapViewDelegate>
@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@end

Había añadido manualmente la línea IBOutlet arriba para el archivo de cabecera, pero sólo en la aplicación en los que no se estaban recibiendo los métodos de delegado.

La solución fue eliminar la línea IBOutlet había añadido manualmente a la cabecera, y luego ir al guión gráfico y CTRL-arrastre desde el MKMapView al bloque @interface en mi ViewController.h. El IBOutlet idéntica se recrea en el archivo de cabecera con el resultado de que todos los métodos de delegados fueron llamados correctamente.

Respondida el 01/03/2015 a las 06:55
fuente por usuario

votos
0

Me acabo de encontrar con esto de nuevo en iOS 7 y cuenta de algo que funciona de forma coherente. El problema que estamos luchando por lo general está llamando setRegion antes de que la región tiene contexto (vista renderizada). iOS 7 añade nuevos métodos de delegados que representan a todas las baldosas que se queden, pero antes de iOS 7 los azulejos en caché evita que el método delegado mapViewDidFinishLoadingMap de ser llamado. En lugar de ello utilizo un "pendingRegion" variable para comprobar si tengo "cola" un cambio de región para cuando el mapa se representa a continuación, sólo tiene que utilizar el método viewDidAppear como una señal del mapa se ha prestado a la pantalla y por lo tanto una región tendrá contexto .

Añadir una variable a su cabecera:

MKCoordinateRegion pendingRegion;

Añadir este método a su código:

-(void)initPendingRegion {
    pendingRegion.center = CLLocationCoordinate2DMake(0.0, 0.0);
}

Agregue esto a su viewDidAppear:

if(pendingRegion.center.latitude != 0.0) {
        MKCoordinateRegion useRegion = pendingRegion;
        [self initPendingRegion];
        [self.mapView setRegion:useRegion animated:YES];
}
Respondida el 26/09/2013 a las 16:26
fuente por usuario

votos
-1

Para mí, funcionó después de añadir NSLocationWhenInUseUsageDescription cadena en Info.plist

Respondida el 03/05/2015 a las 12:12
fuente por usuario

votos
-2

También conocí mismo problema que los suyos. He descubierto que: con el iPhone SDK 3.2 - cuando se crea un nuevo UIViewController con un archivo asociado xib (la opción casilla de diálogo en la creación de UIViewController), no son llamados métodos de delegado de MKMapViewDelegate.

Sin embargo, cuando sigo los pasos siguientes, se ejecuta bien.

  1. Crear una nueva clase UIViewController (nunca escoja la opción: crear el archivo xib asociado con el controlador)

  2. Crear un nuevo archivo xib. Añadir el mapa mediante Interface Builder + posición de la clase del propietario con la clase en el paso 1 ajuste + objeto delegado del punto del mapa a la clase de propietario.

  3. Implementar métodos de delegado para la clase UIViewController en el paso 1.

  4. Cuando quiero usar mi ViewController (con el mapa añadido), lo cargo con el nombre de la semilla de la siguiente ejemplo:

    MapPreviewController* mapPreviewController = [[MapPreviewController alloc] 
        initWithNibName:@"MapPreviewController" bundle:[NSBundle mainBundle]];
    
    [self.centerPanelView addSubview:mapPreviewController.view];
    

El código se ejecuta bien. No sé qué cambios hizo Apple o con el archivo xib cuando creo mi UIViewController utilizando el asistente, pero es posible que la causa de mi problema. Me toma 1 día a encontrar esta solución estúpida.

Si has encontrado otro, por favor, comparta conmigo.

Gracias

Respondida el 02/05/2010 a las 11:09
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more