2011-08-26 16 views
12

Sto tentando di caricare la regione della mappa e i metodi delegati di MKMapView non vengono richiamati sul secondo o sul successivo caricamento. Nessuno dei metodi delegati valeCome cancellare la cache di MKMapView?

- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView; 
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView; 
- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error; 

vengono mai chiamati. Gli unici metodi chiamati sono

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated; 
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; 

Sembra che iOS4 è caching MapView piastrelle immagini.

Ho trovato queste righe nella documentazione di riferimento del protocollo MKMapViewDelegate. La linea evidenziata è il mio problema.

Questo metodo viene chiamato quando sono stati caricati i riquadri della mappa associati alla richiesta corrente. I riquadri della mappa vengono richiesti quando una nuova area visibile viene spostata nella vista e le tessere non sono già disponibili. Le tessere mappa possono anche essere richieste per porzioni della mappa che non sono attualmente visibili. Ad esempio, la visualizzazione della mappa può caricare i riquadri che circondano immediatamente l'area attualmente visibile come necessario per gestire le piccole teglie da parte dell'utente.

Ho bisogno di eseguire determinate operazioni dopo che la mappa è stata caricata, ma poiché nessuno dei metodi delegati sopra menzionati viene chiamato non sono in grado di eseguire la funzionalità desiderata. Qualcuno può suggerire una soluzione per cancellare la cache o fornire una soluzione alternativa per questo? Ho già provato a utilizzare i metodi descritti here e this ma non riesco ancora a ottenere il funzionamento del codice.

+0

Che cosa stai cercando di ottenere utilizzando questi metodi delegati? – AlexB

+0

Ho bisogno di una schermata di mappatura della mappa in didFinishLoadingMap e questo metodo delegato viene chiamato solo una volta, dopo aver memorizzato nella cache le tile non chiama néfinfinished né failLoad delegate. Cosa dovrei fare ora? –

+0

Ho archiviato Apple Bug # 13774496 relativo a questo e ho creato un'app di esempio per mostrare che il problema esiste ancora su iOS6: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed

risposta

3

penso che si può paio willStartLoadingMap, didFinishLoadingMap e regionDidChange, in questo modo:

  • in willStartLoadingMap impostare un flag loading true;
  • in didFinishLoadingMap impostare il caricamento flag su falso e verificare anche se si dispone di una chiamata in coda per il metodo che cattura lo schermo. Se è così, chiamalo;
  • in regionDidChange controllare il flag loading e se è impostato su false, chiamare il metodo che cattura lo schermo. Altrimenti, accodalo in modo che venga eseguito al termine del caricamento della mappa.

In questo modo sei sicuro di catturare lo schermo dopo che le tessere sono state caricate.

Tuttavia, regionDidChange può essere chiamato più volte, quindi assicurarsi di afferrare lo schermo solo quando la vista della mappa cambia in modo significativo (è possibile confrontare la regione/il centro della mappa precedente e la regione/il centro della mappa corrente per questo).

+0

Grazie alexb. Ho aggiunto una piccola patch insieme ai passaggi che hai suggerito e ha fatto il trucco. –

+0

Questo non funziona per lo scenario in cui hai perso la connessione a Internet in modo che non possa caricare più tessere. Chiama ancora il delegato dicendo che la mappa è stata caricata completamente. Sembra un bug da parte di Apple. – iwasrobbed

2

Ho creato un nuovo progetto e collegato il delegato al mio controller di visualizzazione. Vengono chiamati i primi due metodi dei tre in questione. Poiché carica tutte le tessere, non è stato chiamato il metodo del delegato di errore.

Recentemente mi sono imbattuto in problemi simili. Ho creato una sottoclasse di MKMapView e ho dimenticato di impostare il delegato nei miei metodi personalizzati init e in awakeFromNib:. Forse è questo che causa anche i tuoi problemi.

Problemi correlati