2013-05-07 6 views
5

Sto provando a creare una classe di supporto per ottenere facilmente le coordinate del telefono in qualsiasi altra classe. Ho seguito un tutorial in cui il UIViewController ha implementato il <CLLocationManagerDelegate> e ha funzionato. Ho provato a fare lo stesso in un semplice NSObject, ma il mio delegato non è stato più chiamato.CLLocationManager che non chiama delegato in un NSObject

Questo è il codice che ho:

PSCoordinates.h

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 

@interface PSCoordinates : NSObject <CLLocationManagerDelegate> 

@property (nonatomic, retain) CLLocationManager* locationManager; 


@end 

PSCoordinates.m

#import "PSCoordinates.h" 

@implementation PSCoordinates 

- (id) init { 
    self = [super init]; 

    if (self) { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     if ([CLLocationManager locationServicesEnabled]) 
     { 
      self.locationManager.delegate = self; 
      self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
      self.locationManager.distanceFilter = 100.0f; 
      NSLog(@"PSCoordinates init"); 
      [self.locationManager startUpdatingLocation]; 
     } 
    } 
    return self; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"Géolocalisation : %@",[newLocation description]); 
} 

- (void)locationManager:(CLLocationManager *)manager 
     didFailWithError:(NSError *)error 
{ 
    NSLog(@"Géolocalisation (erreur) : %@",[error description]); 

} 


@end 

sto chiamando chiamando

PSCoordinates * coordinates = [[PSCoordinates alloc] init]; 

quando premendo un pulsante. L'init sta funzionando come posso vedere l'NSLog PSCoordinates init.

Ho trovato altri argomenti di persone che hanno lo stesso problema ma nessuna risposta ha risolto.

Il vostro aiuto sarebbe molto apprezzato.

risposta

13

Imposta "Coordinate PS coordinate" come globale nella classe. Funzionerà :)

+0

Sei un capo! Grazie mille :) –

+0

Grazie davvero mi aiuti, Ma lo sai Perché è così? –

+4

@ h.kishan Perché ARC è abilitato per il progetto e si dichiara la variabile 'coordinate' come locale. Il compilatore aggiungerà un messaggio di rilascio a questa istanza il momento successivo in cui scoprirà che l'ambito dell'oggetto è finito. Quindi, la tua istanza è già stata rilasciata e non esiste più. Quindi il tuo delegato non funzionerà. Quando si dichiara la variabile come globale, esisterà fino alla sua classe genitrice. Quindi il tuo delegato verrà chiamato. –