Con molto più ritardo di quello che avevo previsto, ecco la seconda parte del tutorial riguardante il MapKit. Non perdiamoci in convenevoli e veniamo subito al sodo.
Annotation view con immagine personalizzata
Riprendiamo il codice scritto l’altra volta. Eravamo arrivati a creare una annotation view che visualizzava un pin relativo alla sede di Google a Mountain View. Vogliamo ora sostituire il pin con un’immagine personalizzata. Dopo aver scelto quindi l’immagine che più ci aggrada e averla aggiunta tra le risorse dell’applicazione, possiamo modificare il codice che avevamo scritto nel metodo mapView:viewForAnnotation: modificandolo come segue:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
if (annotation == mapView.userLocation) {
return nil;
}
MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease];
annotationView.image = [UIImage imageNamed:@"google.png"];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
return annotationView;
}
Come possiamo notare la sostanziale differenza rispetto al codice scritto precedentemente sta nel fatto che non usiamo più MKPinAnnotationView ma utilizziamo una classe più generica (ad essere precisi la superclasse di MKPinAnnotationView) che ci permette di utilizzare un’immagine a nostra scelta caricandola dalle risorse dell’applicazione (in questo caso google.png) al posto del solito pin. Tutto questo lo facciamo con le righe 5 e 6 del precedente codice, mentre tutte le altre istruzioni sono già state spiegate nel tutorial precedente.
Cacolo della distanza tra due punti e reverse geocoding
La prima cosa che dobbiamo effettuare è importare il framework che ci permette di effettuare questa operazione. Apriamo quindi il file prefix (in XCode lo trovate nel gruppo Other Sources) e modifichiamolo in modo da importare il framework CoreLocation. Alle fine il file dovrebbe presentarsi come segue:
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
#endif
Andiamo ora a creare un nuovo controller (io l’ho chiamato InfoViewController) che si occuperà di gestire la vista che verrà visualizzata quando premiamo sul disclosure button dell’immagine precedente.
Cominciamo subito con l’aprire il file .h che editeremo come segue:
@interface InfoViewController : UIViewController <MKReverseGeocoderDelegate> {
CLLocationDistance distance;
MKReverseGeocoder *reverseGeocoder;
}
- (id)initWithUserLocation:(CLLocation *)userLocation annotation:(id <MKAnnotation>)annotation;
@end
Qui abbiamo abbiamo semplicemente aggiunto una variabile di tipo CLLocationDistance (che in sostanza è un double) nella quale memorizzeremo la distanza che c’è tra l’utente e la locazione selezionata e un metodo init che ci permette di passare al controller la posizione dell’utente e l’annotazione su cui vogliamo lavorare. Dichiariamo inoltre un puntatore ad un geocoder e rendiamo la classe conforme al protocollo MKReverseGeocoderDelegate. Questo, come vedremo, ci permetterà di venire a conoscenza dell’indirizzo della sede di Google.
Passiamo ora all’implementazione di questa classe. Andiamo perciò a scrivere il metodi initWithUserLocation:annotation: definito nel file .h e ridefinendo la loadView.
- (id)initWithUserLocation:(CLLocation *)userLocation annotation:(id <MKAnnotation>)annotation {
self = [super init];
self.title = annotation.title;
CLLocation *location = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:annotation.coordinate.longitude];
distance = [userLocation getDistanceFrom:location];
reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:annotation.coordinate];
reverseGeocoder.delegate = self;
return self;
}
- (void)loadView {
[super loadView];
UILabel *distanceLabel = [[[UILabel alloc] initWithFrame:CGRectMake(5, 0, 310, 24)] autorelease];
distanceLabel.text = [NSString stringWithFormat:@"Distanza in metri: %.0f", distance];
[self.view addSubview:distanceLabel];
}
Quello che facciamo nel metodo initWithUserLocation:annotation: non è altro che il calcolo della distanza tra la posizione dell’utente e le coordinate relative all’annotazione (righe 4 e 5) e di inizializzare il geocoder (righe 6 e 7). Per effettuare la prima operazione ci avvaliamo del metodo getDistanceFrom: di CLLocation (attenti però che dalla 3.2 il metodo risulta deprecato e quindi al suo posto bisogna invocare distanceFromLocation:), mentre per inizializzare il geocoder ci basta passargli le coordinate di cui vogliamo sapere l’indirizzo e settargli il delegate.
Nel loadView ci limitiamo a visualizzare in label la distanza calcolata.
Per avviare il geocoding basta semplicemente usare il metodo start, lo andiamo quindi ad aggiungere ridefinendo la viewDidLoad.
- (void)viewDidLoad {
[reverseGeocoder start];
}
Ora ci manca solo l’implementazione dei metodi per conformarci al protocollo MKReverseGeocoderDelegate. Sono solamente due metodi: uno verrà chiamato quando il geocoding termina con successo, l’altro quando fallisce.
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
NSDictionary *addressData = placemark.addressDictionary;
CGFloat y = 50;
for (NSString *key in [addressData allKeys]) {
if ([key compare:@"FormattedAddressLines"] != NSOrderedSame) {
UILabel *newRow = [[[UILabel alloc] initWithFrame:CGRectMake(5, y, 310, 24)] autorelease];
newRow.text = [NSString stringWithFormat:@"%@: %@", key, [addressData objectForKey:key]];
[self.view addSubview:newRow];
y += 24;
}
}
}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
UILabel *geocoderFail = [[[UILabel alloc] initWithFrame:CGRectMake(5, 50, 310, 24)] autorelease];
geocoderFail.text = @"Reverse geocoding fallito";
[self.view addSubview:geocoderFail];
}
Nel primo metodo (geocoding terminato con successo) visualizziamo in delle labels tutte le informazioni legate alle coordinate che abbiamo passato al geocoder (indirizzo, città, nazione, …), mentre nel caso fallisca ci limitiamo a visualizzare una label che ci informi di ciò.
Ora è praticamente tutto pronto per essere visualizzato sul nostro simulatore. Dobbiamo solo ricordarci di modificare un metodo di MapViewController in modo che, quando premiamo sul disclosure button utilizziamo il view controller appena creato:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
InfoViewController *nextViewController = [[[InfoViewController alloc] initWithUserLocation:mapView.userLocation.location annotation:view.annotation] autorelease];
[self.navigationController pushViewController:nextViewController animated:YES];
}
Questo il risultato sul simulatore…
![]() |
![]() |
… e sull’iPod.
![]() |
![]() |
Come l’altra volta trovate il codice completo su Google code
48 Responses to “T#038 – Utilizzo del MapKit (parte 2): Annotation view calcolo della distanza e reverse geocoding”
5 Maggio 2010
Giovambattista FazioliBel tutorial…
Un aggiunta interessante sarebbe quella di spiegare come visualizzare degli indirizzi dati nelle nostre vicinanze. Questo sarebbe fantastico ! 😀
5 Maggio 2010
Mokka77Non è bello.. è FANTASTICO!!!! Complimenti!!!!
5 Maggio 2010
FabrizioUna cosa che mi è dubbia: l’utilizzo del MapKit e del reverse geocoding con Google su App a pagamento, è consentito?
5 Maggio 2010
Luca Di FrancoDimmi se ho capito bene. Intendi: io inserisco, ad esempio, “via roma” e metto un pin sulla via più vicina con questo nome?
Si
5 Maggio 2010
Giovambattista Fazioli@Luca: diciamo, ho una serie di coordinate (lat e long) e voglio mostrare solo le “annotation” che sono “vicine” alla mia posizione attuale.
5 Maggio 2010
Giovambattista FazioliUna nota: cliccando sul “Callout” due volte, scompare l’immagine e ritorna il “pin” classico rosso… è normale?
5 Maggio 2010
Luca Di FrancoSi certo puoi farlo, addirittura hai due modi diversi:
1 – (quello efficiente) “proteggi” la addAnnotation: con un if che controlla che la distanza che c’è tra l’utente e le coordinate dell’annotation sia inferiore a una certa distanza.
2 – (quello brutto dal punto di vista della memoria) quando crei l’annotation view setti l’attributo hidden della annotation view stessa a YES se la distanza è superiore a un tot.
In entrambi i casi devi però stare attendo ad aggiungere le annotazioni dopo che la posizione dell’utente è stata trovata. In pratica (prendendo come riferimento il codice del tutorial) devi spostare la addAnnotation: dalla loadView nel blocco di codice dove si fa lo zoom.
Ho ridato una controllata veloce al codice, ho tentato di rifare la stessa cosa sia sul simulatore che sul terminale e non mi da questa anomalia.
5 Maggio 2010
Giovambattista FazioliMia svista: avevo dichiarato MKAnnotationView ma allocavo MKPinAnnotationView… Xcode non lo segnala visto il legame delle classi 🙂
5 Maggio 2010
Giovambattista FazioliVedere anche:
http://www.undolog.com/2010/05/05/come-ottenere-latitudine-e-longitudine-in-objective-c/
6 Maggio 2010
Giovambattista Fazioli@luca: diciamo meglio: date lon e lat della posizione attuale, voglio selezionare su un DB (che contiene una serie di località con le relative lat e long) solo le località poste nelle mie vicinanze… qual’è la formula da usare?
6 Maggio 2010
Luca Di FrancoIn teoria per far questo esistono dei database appositi (ora come ora gli unici che mi vengono in mente che supportano le query spaziali sono Oracle e PostgreSQL con la sua estensione PostGIS), che ti permettono di effettuare query proprio come quella che serve a te.
Se invece il database è il classico SQLite su terminale la vedo dura. La formula per calcolare la distanza c’è e la trovi qui:
http://www.movable-type.co.uk/scripts/latlong.html
e scriverti una funzione distance(lat1,long1,lat2,long2) che andrai a mettere nella where della tua query sql. Prima di far questo devi però verificare prima che SQLite supporti tutte le operazioni richieste.
6 Maggio 2010
giorgioCiao Belli 2 note per Luca e per gli altri:
quando nel viewdidload fai partire il reversegeocoder consiglio di farlo così (per esempio):
myTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(reversing) userInfo:NULL repeats:YES];
Google permette una query di reversegeocoding ogni 60 secondi (per ogni ip).
Nei metodi
– (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
e
– (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
aggiungi un bel
[reversegeocoder cancel];
e fai la sua corretta release nella dealloc, altrimenti schianta.
my2cents 😀
6 Maggio 2010
giorgiosorry, nell’NSTimer il selector è ovviamente reverseGeocoder
7 Maggio 2010
MrFucioScusate ma come faccio ad inserire più punti ( si chiamano “annotation”? ) da visualizzare sulla mappa?
Io ho creato un Array di oggetti che implementano il protocollo MKAnnotation simili all’unico oggetto creato in questo Tutorial ma niente..mi legge solo il primo..
Grazie!!!
9 Maggio 2010
The Anonymouswè ciao… io ho il tuo stesso problema… e per quanto riguarda l’inserimento di più punti me lo fa… solo che ogni volta che inserisco il punto nuovo, il titolo e il sottotitolo dei precedenti diventano uguali al titolo e al sottotitolo di quello nuovo….
tu parli di un array, posta il codice che hai scritto, magari in due riusciamo a cavarci fuori qualcosa e risolviamo.. (quello che ho scritto io lo trovi nei commenti della prima parte del tutorial, ma sto ancora aspettando risposta)
9 Maggio 2010
Luca Di FrancoPer inserire più annotazioni mettete la addAnnotation: in un for o usate il metodo addAnnotations: (notare la “s” finale) che prende come input un NSArray.
@The Anonymous
A te rispondo nell’altra parte del tutorial dove hai postato il codice.
9 Maggio 2010
The Anonymousok grazie, allora aspetto 🙂
cmq per quanto riguarda quello che hai detto, se io metto la addAnnotation dentro al ciclo for, dopo mi crea tante annotazioni nuove ma tutte identiche e nello stesso punto.. no??
per quanto riguarda invece l’addAnnotations, come lo devo riempire l’NSArray da passargli???
ciao e grazie!!
9 Maggio 2010
Luca Di FrancoNon so come vuoi riempirlo o usi:
[NSArray arrayWithObjects: annotazione1, annotazione2, …, annotazioneN, nil];
oppure usi un NSMutableArray e te lo riempi passo passo con la addObject:
10 Maggio 2010
giorgio@luca di Franco
guardando nel Mapkit framework non ho trovato nulla per “unire” due o piu punti annotati (non mi sono ancora studiato le notifiche dell’OS 4, magari hanno introdotto qualcosa).
Lo devo fare necessariamente con un drawrect() su una nuova uiview? oppure secondo te c’è qualcosa di meglio?
10 Maggio 2010
MrFucio@Luca di Franco
Io ho usato un NSArray con delle annotazioni dentro ( 4).
Ho usato il metodo addAnnotations: NSArray..
Ma niente….in relatà se uso questo metodo non legge il primo ma il secondo elemento…è strano…
Poi un’altra cosa…se uso questo metodo ( addAnnotations) devo modificare anche altro codice rispetto al tutorial?
Grazie
10 Maggio 2010
Luca Di FrancoE infatti non c’è nulla. Tra le altre cose in via teorica non puoi nemmeno farlo con la drawrect in quando negli agreement dell’SDK c’è scritto che, se devi fare routing tra due punti, devi per forza di cose usare delle mappe tue non quelle fornite dal MapKit.
Non devi modificare proprio niente rispetto al tutorial (fatta eccezione per l’istruzione per aggiungere le annotazioni). Ho provato ora ed effettivamente funziona. Probabilmente sei te che sbagli qualcosa.
10 Maggio 2010
MrFucioSi hai ragione..non sò perchè ma sbagliavo qualcosa…
Adesso mi funziona tutto… Per quanto riguarda le annotation come posso personalizzarle sulla mappa? nel senso… Immagine, testo (anche su più righe) ecc..?
e poi..io ho circa 150-200 annotation da mettere sulla mappa..ma che devo creare 200 classi.h/m ? ditemi che c’è una scorciatoia….:D
Grazie
4 Giugno 2010
ClaudioRaga mi associo alla domanda su come mettere molte annotation sulla mappa utilizzando una sola classe e in più volevo chiedervi come fare a visualizzare i risultati del reverse geocoding in tabella anzichè in una view semplice e come fare a mostrare la distanza che compare nel reverse geocoding come subtitle nel callout??!!
27 Giugno 2010
GeoPhotoFBCiao a tutti,
volevo ringraziarvi per l’aiuto fornitomi nella realizzazione della mia 4a applicazione per Iphone.
Sono contentissimo…e avevo una paura folle che la mia app non venisse accettata…non so il perchè di questa paura…forse il tutto è legato al fatto che la apple ci ha impiegato più di 10 giorni per accettarla.
Ecco la descrizione dell’App.
Quando fai una foto, GeoPhotoFB riconosce il luogo in cui ti trovi. Le foto saranno poi visualizzabili su una mappa nel luogo esatto in cui sono state scattate. Dopo aver condiviso le foto su FaceBook, i tuoi amici potranno accedere alla mappa, ammirare i tuoi scatti e ricambiare il favore coi loro iPhone. In tal modo, tutte le foto condivise con GeoPhotoFB saranno sempre comodamente accessibili per formare un album di ricordi in comune che ti consentirà di guardare il mondo con gli occhi dei tuoi amici.
Spero vi piaccia.
Vi lascio il link per scaricarla
http://itunes.apple.com/it/app/geophotofb/id378633215?mt=8
P.S. Cerco sempre collaboratori che abbiano intenzione di realizzare app per iphone…E’ fantastico
28 Giugno 2010
SmarambaCiao a tutti ,
scusatemi, prendendo spunto dal vostro tutorial,ho inserito piu annotation creandogli delle classi apposite ,per info ecc, ora pero dovrei configurare il callout…cioè quando premo sul disclosure button..
il problema è che ho un unico file xib e piu classi come faccio ad associarli ai vari pin??(non so se sono riuscito a spiegarmi) grazie ;D
3 Luglio 2010
Smarambawow wow wow…piano piano cone le risposte…mi state facendo girare al testa….grazie a tutti…wow…:S….cercherò risp altrove.
25 Agosto 2010
Alessio VinerbiOttimo tutorial!
13 Novembre 2010
AndreaCiao a tutti,
quando clicco sul pin di una specifica locazione, appare correttamente il “popup” contenente il title, il subtitle ed il cllaout button.
Supponiamo che quando tocco tale bottone mi si apre una view di dettaglio. Come faccio a far scomparire anche il “popup” (ma non il pin) non appena premo il bottone di callout?
Grazie mille,
Andrea
1 Dicembre 2010
Luca Di FrancoCiao Andrea, scusa se ti rispondo solo ora ma ho la soluzione giusta per te. Semplicemente quando premi sul callout viene invocato il seguente metodo del delegate
– (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
all’interno di questo metodo devi semplicemente limitarti a chiamare la seguente funzione sulla mapView
– (void)deselectAnnotation:(id )annotation animated:(BOOL)animated
ricordati di passare l’annotazione che è “nascosta” nell’annotation view.
Spero di esserti stato utile 😉
17 Dicembre 2010
MarcelloHo scaricato il progetto ma ricevo questo errore! Come si risolve?
Code Sign error: The identity ‘iPhone Developer: Mario s.c.a.r.l. (xxxxxxxxxx)’ doesn’t match any valid certificate/private key pair in the default keychain
Grazie
17 Dicembre 2010
Luca Di FrancoSignifica che non poi installare l’applicazione sul terminale perché non hai il provisioning profile che avevo io hai tempi.
O indichi nelle preferenze del progetto il tuo provisioning o esegui l’applicazione sul simulatore.
10 Marzo 2011
Sono disperato. Help meQualificatissimo luca, vengo dinnanzi (sotto i suoi piedi e non ti chiedo nemmeno di stare fermo) a lei implorando un aiuto. Come faccio a calcolare la distanza tra le mie annotation (caricate da un file plist mediante un array con relativo Dictionary) e la userlocation? Ti prego aiutami
13 Marzo 2011
pacoottimo!!!
ma volessi implementare più annotazioni?
creo un MutableArray?
15 Marzo 2011
Sono disperato. Help meSono riuscito ad implementare un metodo per farmi calcolare la distanza per ogni annotation contenuta nel mio file plist, ma non capisco perchè mi ripete l’ultimo calcolo effettuato. Allego parte del codice:
for (NSMutableDictionary *dict in prova) {
CLLocationDegrees latpull = (CLLocationDegrees) [[dict objectForKey:@”Latitudine”] doubleValue];
CLLocationDegrees longpull = (CLLocationDegrees) [[dict objectForKey:@”Longitudine”] doubleValue];
CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:mappa.userLocation.location.coordinate.latitude longitude:mappa.userLocation.location.coordinate.longitude];
CLLocation *annotation = [[CLLocation alloc] initWithLatitude:latpull longitude:longpull];
distance = [userLocation distanceFromLocation:annotation];
}
15 Marzo 2011
Luca Di FrancoScusa la scarsa presenza, ma ho un sacco di lavoro da fare per l’università in questo periodo.
Comunque venendo a noi. E’ relativamente corretto il codice che hai postato. Se per “ripete l’ultimo calcolo effettuato” intendi che se hai n location nel dizionario e ti torna n volte sempre l’ultima distanza calcolata il problema sta nell’ultima istruzione. Distance visto così non mi sembra un array, quindi ad ogni ciclo perdi il calcolo precedente e alla fine ti rimane solo l’ultimo. Visto che hai un mutable dictionary perché ad ogni ciclo non aggiungi una chiave “distance” e gli attribuisci il valore che hai calcolato con l’ultima istruzione del tuo for?
15 Marzo 2011
Luca Di Franco@paco ti ho visto dopo :P.
Si usare un mutable array è una buona soluzione.
Caricare tutto da plist come sta facendo Sono disperato per me però è meglio. Almeno in futuro, per esempio, potrai aggiornare le tue annotation semplicemente rimpiazzando un file (che può essere scaricabile da un server) senza toccare il codice.
15 Marzo 2011
Sono disperato. Help megrazie per avermi risposto. Distance è una CLLocationDistance che ho dichiarato nel header. L’ultima tua idea mi sembra la cosa più giusta da fare, ma non ho idea di come fare ad aggiungere una chiave al mio NSMutableDictionary . Scusa l’ignoranza palese ma studio objective-c da poco. Se potessi postarmi qualche riga di codice su come fare te ne sarei grato.
15 Marzo 2011
Luca Di FrancoNSMutableDictionary ha questo metodo
– (void)setObject:(id)anObject forKey:(id)aKey
Per key puoi tranquillamente usare qualcosa come @”Distance”
Attento che però CLLocationDistance è un double mentre la funzione precedentemente richiede un oggetto come value. Devi quindi incapsulare il double in un NSNumber.
+ (NSNumber *)numberWithDouble:(double)value
ovviamente quando lo vuoi usare fai il processo inverso quindi:
– (double)doubleValue
se lo vuoi come double o piu comodo
– (NSString *)stringValue
se vuoi una stringa da mandare a video.
Ti rimando alla documentazione per i dettagli sulle funzioni
15 Marzo 2011
Sono disperato. Help megrazie di cuore anche se ho capito poco di quello che mi hai scritto, ma visto che ti considero un grande lo prendo per buono. mi tocca studiare mi sa.
Grazie ancora e spero di postarti presto una soluzione piuttosto che altre domande.
Ciao
15 Marzo 2011
Luca Di FrancoBeh se preferisci il codice nudo e puro devi fare
[dict setObject:[NSNumber numberWithDouble:distance] forKey:@”Distance”].
Per quanto riguarda l’estrazione dal dizionatio vedo comunque che già lo stai fare (l’hai utilizzato nel codice che hai postato tu).
Ovviamente guardati comunque la documentazione almeno capisci per bene quello che succede 😉
16 Marzo 2011
Sono disperato. Help meAncora mi riporta sempre l’ultimo calcolo. Quello che voglio fare nel mio progetto è in pratica calcolare la distanza di ogni annotation e il risultato mostrarlo nella cell.detailText.text corrispondente e sorting la tabella per la distanza
18 Marzo 2011
Sono disperato. Help meRisolvo un problema e ne esce subito un altro. Ti posto il codice:
for (NSMutableDictionary *dict in prova){
Farmacie *annotation = [[Farmacie alloc] initWithDictionary:dict];
[mappa addAnnotation:annotation];
[annotation release];
int Index;
for (Index = [prova count]-1; Index < [prova count];Index++){
CLLocationDegrees latpull = (CLLocationDegrees) [[dict valueForKey:@"Latitudine"] doubleValue];
CLLocationDegrees longpull = (CLLocationDegrees) [[dict valueForKey:@"Longitudine"] doubleValue];
CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:mappa.userLocation.location.coordinate.latitude longitude:mappa.userLocation.location.coordinate.longitude];
CLLocation *location = [[CLLocation alloc] initWithLatitude:latpull longitude:longpull];
distance = [userLocation distanceFromLocation:location];
[dict setObject:[NSNumber numberWithDouble:distance] forKey:@"Distanza"];
}
NSSortDescriptor *nome = [[NSSortDescriptor alloc] initWithKey:@"Nome" ascending:YES];
[prova sortUsingDescriptors:[NSMutableArray arrayWithObject:nome]];
self.risultati = prova;
[prova release];
}
Al momento di passare il mutable array alla uitable view mi esce fuori un errore dalla console:
Collection was mutated while being enumerated.
18 Marzo 2011
Sono disperato. Help meRISOLTOOOOOOOOOOOOOOOOOOO!!!!!!!!!!
Avevi ragione…..bisogna studiare la documentazione ufficiale. Grazie di cuore Luca
22 Marzo 2011
in cerca di miglioramentiCaro Luca ho cercato nella documentazione ufficiale ma quanto sto per esporti non trova soluzione.
Mediante un pulsante devo calcolare il percorso userLocation – annotazione. questo è il codice:
-(IBAction)calcolapercorso:(id)sender {
for (NSMutableDictionary *dict in risultati){
Farmacie *annotation = [[Farmacie alloc] initWithDictionary:dict];
Tabacchi *annotation2 = [[Tabacchi alloc] initWithDictionary:dict];
if([annotation isKindOfClass:[Farmacie class]]&&[[annotation title] isEqualToString:[dict objectForKey:@”Nome”]]){
NSURL *url = [[NSURL alloc] initWithString:[dict objectForKey:@”percorso”]];
[[UIApplication sharedApplication] openURL:url];
}
}
dove percorso non è altro che un url di google map.
Il problema è che, nonostante mi esegua il ciclo for per un numero corretto di volte, mi passa all’applicativo mappe dell’iphone sempre la stessa url (percorso).
Io continuo a cercare, ma qualche dritta sarebbe molto apprezzata.
Grazie
10 Giugno 2011
PasqualeSalve a tutti,
sto seguendo passo passo il tutorial e lo trovo fantastico e molto ben fatto.
Fino ad ora nessun problema ma adesso, dopo aver inserito InfoViewController, ottengo un errore che riporto sotto.
Ho sostituito come indicato “getDistanceFrom:” con “distanceFromLocation:”
Qualcuno sa cosa fare?
Grazie.
“_OBJC_CLASS_$_CLLocation”, referenced from:
objc-class-ref-to-CLLocation in InfoViewController.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
10 Giugno 2011
PasqualeHo risolto,
non avevo aggiunto il framework CoreLocation!!
Grazie!!
15 Giugno 2011
FraScusate, mi servirebbe un’informazione urgente. Sto cercando di creare una variabile CLLocation da valori di latitudine e longitudine LONG INT. Come faccio?
22 Maggio 2012
Massimilianomi sapete aiutare ? provo ad aggiungere il pacchetto MapKit.framework, ma quando compilo mi dice :ignoring file /Users/massimilianodimella/Downloads/sqlTutorial/MapKit.framework/MapKit, file was built for unsupported file format which is not the architecture being linked (i386)
come posso risolvere sta cosa ?