2009-09-04 16 views
10

En un UIViewController agrego un MKMapView a la vista controlada por el controlador.MKMapView no llama a los métodos de delegado

- (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 adelante en el controlador Tengo

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

Hecho no 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?

EDIT:

El problema parece ser cuando UIViewController se hizo el delegado de la 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.

Respuesta

1

quizá bastante obvio, pero sólo la comprobación:

se ha asegurado de que su declaración viewcontroller se hace correctamente. Algo así como:

@interface YourViewController : UIViewController <MKMapViewDelegate> 
+1

De hecho, tengo. Me pregunto si tiene algo que ver con la nueva forma en que XCode 3.2 y el SDK funcionan en conjunto. Este es el primer Mapkit que he probado desde que salió el 10.6. – criscokid

4

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

+0

Esta es la solución correcta. Yo era el mapview, debía saber quién era su delegado. – DexterW

+6

No es una solución en absoluto, solo una manera diferente de lograr lo mismo. Se le dice a la vista del mapa quién es su delegado en la línea map.delegate = self; Arrastrar y arrastrar en IB es el equivalente visual de establecer programáticamente el delegado. –

-2

También encontré el mismo problema que el suyo. Encontré que: con el iPhone SDK 3.2, cuando creo un nuevo UIViewController con un archivo xib asociado (la opción de casilla de verificación en el cuadro de diálogo de creación de UIViewController), los métodos delegados de MKMapViewDelegate nunca se llaman.

Sin embargo, cuando sigo los pasos a continuación, funciona 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. Agregue el mapa utilizando Interface Builder + configurando la clase Owner con la clase en el paso 1 + configurando el objeto delegado del punto del mapa a la clase propietaria.

  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 funciona bien. No sé lo que Apple cambia o hizo con el archivo xib cuando creo mi UIViewController usando el asistente, pero puede ser la causa de mi problema. Me lleva 1 día encontrar esta estúpida solución.

Si encontró otra, por favor comparta conmigo.

Gracias

+0

Eso es un poco hacky ... ¿por qué no se llama al delegado? – DexterW

1

yo tuvimos un problema similar con los métodos de MKMapViewDelegate no ser llamados. Mi problema fue configurar MKCoordinateRegionMakeWithDistance y regionThatFits en el controlador -viewDidLoad() Quería mostrar solo la región alrededor de mi casa y no comenzar con la vista del mundo.Entonces, después de agregar anotaciones en viewDidLoad del controlador, inicié un temporizador. Cuando vence en un segundo, hago un acercamiento a la región que quiero con las API anteriores y los métodos de delegado se activan. Simplemente me marea un poco y me inclino a vomitar en mi iPad.

Ahora solo tengo que lidiar con las malditas advertencias de memoria baja.

8

Tuve exactamente el mismo problema: le había asignado < MKMapViewDeledate> a mi controlador, y vinculé el delegado a "Propietario del archivo" en el Creador de interfaz, pero aún así no se invocaron los métodos delegados implementados.

La razón es que desde iOS 4, los mapas se almacenan en caché, y cada vez que una aplicación muestra un mapa en caché, no se invocan métodos como "mapViewDidFinishLoadingMap". Restablecer "contenidos y configuraciones" en el simulador borra los mapas en caché y, por lo tanto, resuelve el problema.

+1

Simplemente reinicie mi "contenido y configuración" en mi dispositivo y, efectivamente, esos métodos se llamaron en la primera ejecución. ¡Pero sin suerte en la segunda carrera! – Mac

+2

Hm, parece que 'mapViewDidFinishLoadingMap: mapView' no es muy útil en ese momento. –

0

Acabo de toparme con esto nuevamente en iOS 7 y descubrí algo que funciona de manera consistente. El problema por el que normalmente peleamos es llamar a setRegion antes de que la región tenga contexto (vista procesada). iOS 7 agrega nuevos métodos delegados que representan todas las teselas que se procesan, pero antes de iOS 7 las teselas en la memoria caché evitan que se llame al método delegado mapViewDidFinishLoadingMap. En su lugar, utilizo una variable "pendingRegion" para verificar si he "puesto en cola" un cambio de región para cuando se representa el mapa y luego simplemente uso el método viewDidAppear como una señal de que el mapa se ha renderizado en 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); 
} 

Agregar a su viewDidAppear:

if(pendingRegion.center.latitude != 0.0) { 
     MKCoordinateRegion useRegion = pendingRegion; 
     [self initPendingRegion]; 
     [self.mapView setRegion:useRegion animated:YES]; 
} 
0

tuve un problema similar en el edificio XCode 6.1 para iOS 8.1 donde no se llamaba a ninguno de los métodos MKMapViewDelegate. En una segunda aplicación, el código idéntico dio como resultado que los métodos MKMapViewDelegate se llamaran como se esperaba.

En ViewController.m el delegado MAPview se establece como sigue:

- (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 donde los métodos de delegado no se estaban recibiendo.

La solución fue eliminar la línea IBOutlet que había agregado manualmente al encabezado, y luego ir al guión gráfico y presionar CTRL desde el MKMapView al bloque @interface en mi ViewController.h. El IBOutlet idéntico se volvió a crear en el archivo de encabezado con el resultado de que todos los métodos de delegado se llamaron correctamente.

-1

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

6

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

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 
+0

Salvavidas - gracias! En mi aplicación, tengo múltiples mapas y se llama a 'mapViewDidFinishLoadingMap' cuando se carga el primer mapa, pero no se llama cuando se carga el segundo mapa. Sin embargo, se llama a 'mapViewDidFinishRenderingMap' cada vez que se representa cada mapa. Respuesta perfecta, gracias! – nurider

0

Mi problema es que olvidé establecer la ubicación en el simulador.Vaya a Simulator -> Debug -> Location -> Custom location... y los métodos MKMapViewDelegate comenzarán a llamar al

Cuestiones relacionadas