2009-09-04 13 views
10

In un UIViewController aggiungo un MKMapView alla vista controllata dal controller.MKMapView non chiama i metodi delegati

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

Più tardi nel regolatore ho

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

Fatto non viene mai stampato. Nessuno degli altri metodi delegate viene richiamato come mapView: viewForAnnotation: utilizzo MKMapView in un'altra app, ma ciò sembra accadere su qualsiasi nuova applicazione che creo. Qualcun altro ha visto questo comportamento?

EDIT:

Il problema sembra essere quando UIViewController è fatto il delegato del MKMapView, una sottoclasse diretta di NSObject sembra funzionare bene. Posso lavorare in questo modo, sembra ancora molto strano da quando l'ho fatto prima.

risposta

1

forse abbastanza ovvio, ma solo controllando:

Avete fatto che la dichiarazione viewcontroller è fatto correttamente. Qualcosa di simile:

@interface YourViewController : UIViewController <MKMapViewDelegate> 
+1

In effetti ho. Mi chiedo se abbia qualcosa a che fare con il nuovo modo in cui XCode 3.2 e SDK lavorano insieme. Questo è il primo Mapkit che ho provato a partire dal 10.6. – criscokid

4

Forse avete bisogno di andare al IB e di controllo trascinare dalla MKMapView al conroller vista, quindi selezionare delegato per renderlo un delegato ???

+0

Questa è la soluzione corretta. Ero il mapview deve sapere chi è il suo delegato. – DexterW

+6

Non è affatto una soluzione, solo un modo diverso di realizzare la stessa cosa. Alla vista mappa viene indicato chi è il suo delegato nella linea map.delegate = self; Controllo-trascinamento in IB, è l'equivalente visivo dell'impostazione programmata del delegato. –

-2

Ho anche incontrato lo stesso problema come il tuo. Ho scoperto che: con l'SDK iPhone 3.2 - quando creo un nuovo UIViewController con un file xib associato (l'opzione checkbox nella finestra di dialogo di creazione di UIViewController), i metodi delegati di MKMapViewDelegate non vengono mai chiamati.

Tuttavia, quando seguo i passaggi seguenti, funziona bene.

  1. creare una nuova classe UIViewController (mai selezionare l'opzione: Crea file XI ter associato con il controller)

  2. Creare un nuovo file XI ter. Aggiungi la mappa utilizzando Interface Builder + impostando la classe Owner con la classe nel passaggio 1 + impostando l'oggetto delegato del punto di mappa sulla classe owner.

  3. Implementare metodi delegato per la classe UIViewController al punto 1.

  4. Quando voglio usare il mio ViewController (con la mappa aggiunto), che carico con il nome pennino come di seguito Esempio:

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

Il codice funziona correttamente. Non so che cosa Apple cambi o abbia fatto con il file xib quando creo il mio UIViewController usando la procedura guidata, ma potrebbe essere la causa principale del mio problema. Mi ci vuole 1 giorno per trovare questa stupida soluzione.

Se ne hai trovato un altro, per favore condividi me.

Grazie

+0

È una specie di hacky ... perché il delegato non viene chiamato? – DexterW

1

Ho avuto un problema simile con i metodi di MKMapViewDelegate non essere chiamato. Il mio problema era impostare MKCoordinateRegionMakeWithDistance e regionThatFits nel controller -viewDidLoad(). Volevo solo mostrare la regione intorno a casa mia e non iniziare con la vista mondo.Quindi, dopo aver aggiunto annotazioni nel viewDidLoad del controller, ho avviato un timer. Quando scade in un secondo, eseguo lo zoom in base alla regione che desidero con le API precedenti e i metodi dei delegati vengono attivati. Mi fa venire un po 'le vertigini e sono incline a vomitare sul mio iPad.

Ora ho solo a che fare con gli avvisi di memoria scadente.

8

Ho avuto lo stesso problema: avevo assegnato < MKMapViewDeledate> al mio controller e collegato il delegato a "File owner" in Interface Builder, ma i miei metodi delegati implementati non venivano ancora chiamati.

Il motivo è che da iOS 4, le mappe vengono memorizzate nella cache e ogni volta che un'applicazione visualizza una mappa memorizzata nella cache, i metodi come "mapViewDidFinishLoadingMap" non vengono chiamati. La reimpostazione di "contenuti e impostazioni" nel simulatore cancella le mappe memorizzate nella cache e pertanto risolve il problema.

+1

Basta ripristinare i miei "contenuti e impostazioni" sul mio dispositivo e abbastanza sicuro che quei metodi sono stati richiamati alla prima esecuzione. Ma senza fortuna alla seconda manche! – Mac

+2

Hm, sembra 'mapViewDidFinishLoadingMap: mapView' non è molto utile allora. –

0

Mi sono appena imbattuto in questo di nuovo su iOS 7 e capito qualcosa che funziona in modo coerente. Il problema che in genere stiamo combattendo è chiamare setRegion prima che la regione abbia un contesto (vista resa). iOS 7 aggiunge nuovi metodi delegati che rappresentano tutti i riquadri sottoposti a rendering, ma pre-iOS 7 i riquadri memorizzati nella cache impediscono il richiamo del metodo delegate mapViewDidFinishLoadingMap. Invece io uso una variabile "pendingRegion" per verificare se ho "accodato" una modifica della regione per quando la mappa è sottoposta a rendering e quindi semplicemente uso il metodo viewDidAppear come un segnale che la mappa è stata renderizzata sullo schermo e quindi una regione avrà un contesto .

Aggiungere una variabile per l'intestazione:

MKCoordinateRegion pendingRegion; 

Aggiungi questo metodo per il codice:

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

Aggiungi questo al vostro viewDidAppear:

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

ho avuto un problema simile in XCode 6.1 building per iOS 8.1 in cui nessuno dei metodi MKMapViewDelegate veniva chiamato. In una seconda applicazione, il codice identico ha comportato il richiamo dei metodi MKMapViewDelegate come previsto.

In ViewController.m delegato mapview è fissato come segue:

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

In ViewController.h:

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

avevo aggiunto manualmente la riga IBOutlet sopra al file di intestazione, ma solo nell'app in cui i metodi delegati non venivano ricevuti.

La soluzione era eliminare la riga IBOutlet che avevo aggiunto manualmente all'intestazione, quindi andare allo storyboard e trascinare CTRL dal MKMapView al blocco @interface nel mio ViewController.h. L'identico IBOutlet è stato ricreato nel file di intestazione con il risultato che tutti i metodi delegati sono stati richiamati correttamente.

-1

Per me, ha funzionato dopo l'aggiunta NSLocationWhenInUseUsageDescription stringa nel Info.plist

6

Un po 'vecchio, ma dal momento che iOS 7 c'è un nuovo metodo che potrebbe funzionare. risolto il mio problema

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

Lifesaver - grazie! Nella mia app ho più mappe e 'mapViewDidFinishLoadingMap' viene chiamato quando la prima mappa viene caricata ma non chiamata quando viene caricata la seconda mappa. Tuttavia, 'mapViewDidFinishRenderingMap' viene chiamato ogni volta che viene resa ogni mappa. Risposta perfetta, grazie! – nurider

0

Il mio problema è che ho dimenticato di impostare la posizione nel simulatore.Vai a Simulator -> Debug -> Location -> Custom location... e i metodi MKMapViewDelegate inizieranno a chiamare

Problemi correlati