2013-01-06 13 views
5

viewControllerが表示されたときにユーザーの座標を取得しようとしています。私はいくつかのviewControllerで場所が必要なので、私はappDelegateにlocationManagerを配置します。私の問題は、最初のviewDidAppearでは座標がまだ見つかりませんでした。これを変更するにはどうすればいいですか?皆さん、ありがとうございました!!!appDelegateのlocationManagerからviewControllerに座標を渡します。

- (NSString *)getUserCoordinates 
{ 
NSString *userCoordinates = [NSString stringWithFormat:@"latitude: %f longitude: %f", 
locationManager.location.coordinate.latitude,  locationManager.location.coordinate.longitude]; 
locationManager = [[CLLocationManager alloc] init]; 
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move 
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m 
[locationManager startUpdatingLocation]; 
return userCoordinates; 
} 

私のViewControllerはこれで座標を取得します:

私AppDelegateはこの持ち

私ViewControllersがすべて持っているので、私は最近、AppDelegateで同じこと、ロケーションマネージャを実装しました
- (void)viewDidAppear 
{ 
NSString *userCoordinates =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserCoordinates]; 
} 

答えて

6

ロケーションデータへのアクセス。

新しいロケーションデータを取得するために、CoreLocationデリゲートメソッド、特にdidUpdateLocationsを実装することを忘れないでください。私はそれをAppDelegateクラスに入れます。

1つのオブジェクト(AppDelegate)が多くのviewControllerに位置更新について通知する必要があるため、NSNotificationを使用することをお勧めします。あなたのAppDelegateで

、あなたは...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
// set up location manager 
self.locationManager = [[CLLocationManager alloc] init]; 
[self.locationManager setDelegate:self]; 
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[self.locationManager startUpdatingLocation]; 
return YES; 
} 

- (void)locationManager:(CLLocationManager *)manager 
didUpdateLocations:(NSArray *)locations { 
CLLocation * newLocation = [locations lastObject]; 
// post notification that a new location has been found 
[[NSNotificationCenter defaultCenter] postNotificationName:@"newLocationNotif" 
                  object:self 
                  userInfo:[NSDictionary dictionaryWithObject:newLocation 
                           forKey:@"newLocationResult"]]; 
} 

を書くでしょうそして、あなたのViewControllerに、あなたはviewDidAppearメソッドを使用することはありません。代わりに、あなたがこれを行うだろう...

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// subscribe to location updates 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(updatedLocation:) 
              name:@"newLocationNotif" 
              object:nil]; 
} 

、あなたはあなたが他のviewControllersもオブザーバーとしてそれらを追加することで、通知の更新を購読することができ、この

-(void) updatedLocation:(NSNotification*)notif { 
CLLocation* userLocation = (CLLocation*)[[notif userInfo] valueForKey:@"newLocationResult"]; 
} 

のように見える方法updatedLocationを持っているでしょう。

+0

素晴らしい作品です!ありがとうございました。 ただし、通知が既に送信された後にリッスンビューが読み込まれるため、ユーザーの初期位置が失われます。 AppDelegateに変数を追加して、すべてのビューがアクセスできる場所を維持しました。 – thedp

+0

@thedpどうやってやったの?その変数がすべてのビューからアクセス可能であるという例を表示できますか? –

+0

@UtkuDalmaz私は、AppDelegateと、この 'appDelegateInst =(AppDelegate *)[[UIApplication sharedApplication] delegate];'を使う他のビューコントローラから 'CLLocation'変数を配置しました。これで、グローバル変数のようなすべてのappDelegate変数にアクセスできます。 – thedp

0

また、CLLocationをkeypath @ "currentUserLocation"(単にnamingexample)の下でuserDefaultsに緯度と経度の辞書として保存することもできます。

そして、あなたのviewDidLoadあなたはこのようなキーパスへのオブザーバーとしてのコントローラを設定中:

[[NSUserDefaults standardUserDefaults] addObserver:self forKeyPath:@"currentUserLocation" options:NSKeyValueObservingOptionNew context:NULL]; 

とのようなものを実装しています

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
if ([keyPath isEqualToString:@"currentUserLocation"]) { 

    NSUserDefaults *df = [NSUserDefaults standardUserDefaults]; 
    NSDictionary *dict = [df objectForKey:@"currentUserLocation"]; 
    NSLog(@"yea we have updated location dict %@", dict); 
} 

}

これは、あなたができることを意味しあなたのアプリケーション内の任意の場所に更新し、UserDefault(私の場合はkeyPath @ "currentUserLocation")を更新するとすぐにオブザーバーはこれを手に入れるでしょう。私は、ある意味で通知センターのようなものだと思いますか? :)

このソリューションは私の場合には完全に機能しました。

関連する問題