5

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

私のAppDelegateにはこれがあります:

- (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はこれで座標を取得します:

- (void)viewDidAppear 
{
NSString *userCoordinates =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserCoordinates];
}
4

2 に答える 2

7

最近、同じことをAppDelegateにロケーションマネージャーを実装して、ViewControllerがすべてロケーションデータにアクセスできるようにしました。

新しいロケーションデータを取得するために、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];
}

次のようなメソッドupdatedLocationがあります

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

他のviewControllerにも、オブザーバーとして追加することで通知の更新をサブスクライブさせることができます。

于 2013-01-06T07:09:45.227 に答える
0

CLLocationまた、キーパス @"currentUserLocation" の下の 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") を更新するとすぐに、任意のオブザーバーがこれを取得します。ある意味、notificationCenter に似ていると思いますか? :)

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

于 2014-02-12T09:12:37.317 に答える