Доступ к newLocation из метода locationManager из других ViewController - PullRequest
2 голосов
/ 09 марта 2012

Я использую CoreLocation и запускаю locationManager из приложения AppDelegate.Пример кода ниже ...

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // ...

    // start location manager
    if([CLLocationManager locationServicesEnabled])
    {
        myLocationManager_ = [[CLLocationManager alloc] init];
        myLocationManager_.delegate = self;
        [myLocationManager_ startUpdatingLocation];
    }
    else 
    {
        // ... rest of code snipped to keep this short

И в этом методе мы видим обновленное местоположение.

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSString *currentLatitude = [[NSString alloc] initWithFormat:@"%g", newLocation.coordinate.latitude];
    NSLog(@"AppDelegate says: latitude: %@", currentLatitude);

    // ... rest of code snipped

Теперь, в других областях моегоПриложение мне нужно для определения текущего местоположения пользователя (широта, долгота).Я мог бы включить приведенный выше код в ViewControllers, которым требуется текущее местоположение, но тогда у меня будет несколько запущенных экземпляров CLLocationManager (я думаю) - и зачем дублировать этот код ??Разве нет способа, которым из других ViewControllers я могу просто получить информацию о местоположении из AppDelegate?

PS - я использую Xcode 4.3 с ARC

Ответы [ 2 ]

6 голосов
/ 11 марта 2012

Спасибо, Мохабитар, что ответили на этот вопрос для меня!Для ясности я разместил свой код для других пользователей.

Примечание: только соответствующие части показаны ниже.

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic, strong) CLLocationManager *myLocationManager;
@property (nonatomic, strong) CLLocation *currentLocation;

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    if([CLLocationManager locationServicesEnabled])
    {
        currentLocation_ = [[CLLocation alloc] init];

        myLocationManager_ = [[CLLocationManager alloc] init];
        myLocationManager_.delegate = self;
        [myLocationManager_ startUpdatingLocation];
    }
}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    currentLocation_ = newLocation;
}

Другие ViewControllers.h

@property (strong, nonatomic) CLLocation *currentLocation;

Другие ViewControllers.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    if([CLLocationManager locationServicesEnabled])
    {
        AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
        currentLocation_ = [[CLLocation alloc] initWithLatitude:appDelegate.currentLocation.coordinate.latitude longitude:appDelegate.currentLocation.coordinate.longitude];
    }
}

Еще раз спасибо!

2 голосов
/ 09 марта 2012

Для этого объявите переменную как свойство в appDelegate:

@property (nonatomic, retain) NSArray *array;

(@ синтезировать и в вашем .m)

Затем в ваших контроллерах представления создайте переменную appDelegate:

AppDelegate *appDelegate=(AppDelegate*)[[UIApplication sharedApplication] delegate];

тогда вы можете сделать: NSLog(@"%@", appDelegate.array);

...