ユーザーのとUIViewControllers
にアクセスする必要がある2つの異なるものがあります。ビューが表示されたときに一度だけその場所にアクセスする必要があります。現在、アプリ デリゲートに を保存していますが、メソッドの読み込みが速すぎて、ユーザーの場所が見つかりません。これについて最善の方法を知っている人はいますか?ありがとうございました!Latitude
Longitude
LocationManager
viewDidAppear:
質問する
146 次
2 に答える
1
NSNotification
s が役立つ典型的なケースのように聞こえます。CoreLocation は通知を送信しないと思います。その場合は、自分で行う必要があります。AppDelegate.h で次を定義します。
const string* LocationUpdateNotification = @"LocationUpdateNotification";
次に、AppDelegate.m の CoreLocation デリゲート メソッドで次のようにします。
dispatch_async(dispatch_get_main_queue(), ^
{
[[NSNotificationCenter defaultCenter] postNofificationName:LocationUpdateNotification
object:self];
});
最後に、各ビュー コントローラーで次のようにします。
[[NSNotificationCenter defaultCenter] addObserverForName:MyNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification* note)
{
// YOUR LOCATION UPDATE CODE.
}];
于 2013-01-16T10:35:25.763 に答える
1
共有を作成しLocationManager
ます。その後startUpdatingLocation
、stopUpdatingLocation
コールバックを取得した後。
私が使用するコードは次のとおりです。
appDelegate
次のメソッドを追加します。
+ (NHAppDelegate *)sharedDelegate
{
return (NHAppDelegate *)[[UIApplication sharedApplication] delegate];
}
そして LocationManager を利用可能にします:
@property (nonatomic, strong) CLLocationManager *locationManager;
次に、UIViewController で次のことができます。
[NHAppDelegate sharedDelegate].locationManager.delegate = self;
[[NHAppDelegate sharedDelegate].locationManager startUpdatingLocation];
次に、次のコードを使用して場所を取得し、UILabel に表示します。
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
[self loadPositionWithLocation:newLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations objectAtIndex:0];
[self loadPositionWithLocation:location];
}
-(void)loadPositionWithLocation:(CLLocation *)newLocation
{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:newLocation completionHandler:
^(NSArray* placemarks, NSError* error){
if ([placemarks count] > 0)
{
CLPlacemark *placemark = [placemarks objectAtIndex:0];
NSString *thoroughfare = placemark.thoroughfare;
NSString *subThoroughfare = placemark.subThoroughfare;
NSString *postalCode = placemark.postalCode;
NSString *locality = placemark.locality;
if( thoroughfare == nil ) { thoroughfare = @""; }
if( subThoroughfare == nil ) { subThoroughfare = @""; }
if( postalCode == nil ) { postalCode = @""; }
if( locality == nil ) { locality = @""; }
NSString *addressString = [NSString stringWithFormat:@"%@ %@\n%@ %@", thoroughfare, subThoroughfare, postalCode, locality];
self.positionLabel.text = addressString;
[[NHAppDelegate sharedDelegate].locationManager stopUpdatingLocation];
}
}];
}
重要なのは最後の行なstopUpdatingLocation
ので、LocationManager
一度だけ呼び出されます。
于 2013-01-16T10:28:10.520 に答える