0

Voici la méthode complète, je n'ai pas mis la deuxième moitié à l'origine parce que je sais que cela fonctionne:Core Location retour 00

-(void)showDirections 
{ 
    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 
    [locationManager setDelegate:self]; 

    CLLocation *location = [locationManager location]; 

    CLLocationCoordinate2D coordinate = [location coordinate]; 
    NSNumber *myLatitude = [NSNumber numberWithDouble:coordinate.latitude]; 
    NSNumber *myLongitude = [NSNumber numberWithDouble:coordinate.longitude]; 
    double myLatitude2 = [myLatitude doubleValue]; 
    double myLongitude2 = [myLongitude doubleValue]; 


    NSArray *array = [dataHold objectForKey:@"Subtree"]; 
    NSString *latitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:4]]; 
    NSString *longitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:5]]; 
    double clubLatitude = [latitude doubleValue]; 
    double clubLongitude = [longitude doubleValue]; 
    CLLocationCoordinate2D start = { myLatitude2, myLongitude2};  
    CLLocationCoordinate2D destination = { clubLatitude, clubLongitude};   
    NSString *googleMapsURLString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%1.6f,%1.6f&daddr=%1.6f,%1.6f",start.latitude, start.longitude, destination.latitude, destination.longitude]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapsURLString]]; 

} 
+3

Ok, pourquoi dans le monde vous la boxe/unboxing il? Il semble que vous pourriez avoir besoin d'un rappel sur l'utilisation de 'NSNumber': -/ –

Répondre

1

Deux questions:

1) Vous faites une boîte NSNumber/le cycle Unbox qui n'a aucune utilité

2) emplacement de base est asynchrone, vous ne pouvez donc pas retourner l'emplacement de l'utilisateur tout de suite, vous devez utiliser la méthode délégué (s) pour récupérer l'emplacement si/quand il est disponible.

Voici un exemple de la façon dont il devrait travail:

-(void)showDirections 
{ 
    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 
    [locationManager setDelegate:self]; 

    [locationManager startUpdatingLocation]; 
} 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    CLLocationCoordinate2D coord = [newLocation coordinate]; 
    NSArray *array = [dataHold objectForKey:@"Subtree"]; 
    NSString *latitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:4]]; 
    NSString *longitude = [NSString stringWithFormat:@"%@",[array objectAtIndex:5]]; 
    double clubLatitude = [latitude doubleValue]; 
    double clubLongitude = [longitude doubleValue]; 
    NSString *googleMapsURLString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%1.6f,%1.6f&daddr=%1.6f,%1.6f", coord.latitude, coord.longitude, clubLatitude, clubLongitude]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:googleMapsURLString]]; 
} 
+0

Je l'ai mis à jour, pouvez-vous jeter un autre coup d'œil? – Eric

+0

pourquoi est-il si simple dans l'exemple de code apple Emplacements? – Eric

+0

CLLocationCoordinate2D coordinate = [coordonnées d'emplacement]; // NSLog (@ "% @", coordonnée); \t [event setLatitude: [NSNumber numberWithDouble: coordinate.latitude]]; \t [event setLongitude: [NSNumber numberWithDouble: coordinate.longitude]]; – Eric

1

La quatrième ligne de votre code est où le problème commence. Vous ne pouvez pas obtenir l'emplacement instantanément, vous devrez attendre que les services de localisation avisent le délégué qu'un emplacement est disponible. Je vais ajouter quelques commentaires à votre code pour expliquer:

-(void)showDirections 
{ 
    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 
    [locationManager setDelegate:self]; 

    // this is not where you should be looking 
    CLLocation *location = [locationManager location]; 

    // the rest of this function is not included in this example ... 
} 

Puisque vous définissez le délégué comme « soi », la classe actuelle, mais mettre en œuvre le protocole « CLLocationManagerDelegate », qui définit les deux fonctions suivantes:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { /* */ } 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { /* */ } 

C'est là que vous obtiendrez un emplacement qui vous est fourni.

Ne pas oublier de mettre à jour votre définition de classe comme ceci:

@interface MyClass : NSObject <CLLocationManagerDelegate> { 

Et comme une note de côté, il semble que vous ne comprenez pas les délégués et le but qu'ils servent, ce qui est bien si vous êtes nouveau à Objective-C, mais se familiariser avec eux va certainement vous rendre la vie un peu plus facile.

d'autres choses utiles:

+0

maintenant quand je rentre dans le programme, la vue qui charge est la vue qui le renvoie à l'application de la carte. Je suis pris dans une boucle infinie. – Eric

+0

C'est une décision de conception et non liée à l'emplacement de base. Dans le UIApplicationDelegate (vous auriez implémenté certaines de ses fonctions dans le délégué d'application) vous pouvez utiliser "application: didFinishLaunchingWithOptions:" pour voir si l'application a été lancée avec une URL, et si elle était alors ne pas le lancer à nouveau :) – Nippysaurus

+0

http : //developer.apple.com/library/ios/documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html #// apple_ref/occ/intfm/UIApplicationDelegate/application: didFinishLaunchingWithOptions: – Nippysaurus

Questions connexes