2011-08-08 21 views
1

CLLocationManagerを初めて使用しています。私は正しいことをしているかどうかはわかりません。私が間違っていれば私を訂正してください。CLLocationManager startUpdating UIButtonを使用した位置

viewDidLoadメソッドでlocationManagerを初期化し、locationManagerに同じメソッドでLocationUpdatingを開始するように指示します。

デリゲートは、このデリゲートメソッドを繰り返し呼び出しを避けるために

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 

    [locationManager stopUpdatingLocation]; 
    //do stuff with the coordinates 
} 

を受けます。

私は、ユーザーが

//called by user action 
-(IBAction)updateLocation{ 
    //start updating delegate 
    locationManager.delegate=self; 
    [locationManager startUpdatingLocation];  
} 

しかしときの位置の変化と、私はUIbuttonをクリックすると、位置座標が全く変化しDONOT場所を更新するためにクリックすることができますUIButtonを持っています。 :(

何私が間違っているの?これはやっての権利ですか、私はすべての?

ヘルプでlocationManagerを止めるべきではないことは理解されるであろう。

+0

をdelegate-:Appleのサンプルコードでは、最高のは、デリゲートを複数回呼び出して、返された位置の精度に対するあなたの所望の精度をチェックすることにより、これを行う方法を示しています。http ://developer.apple.com/library/ios/#samplecode/LocateMe/Introduction/Intro.html – iwasrobbed

答えて

10

CLLocationManagerがあなたの最後の位置をキャッシュして、それを返しますすぐに-startUpdatingLocationと呼ぶと、更新を開始し、古い場所を受け取り、更新を停止しています。

これは、-startUpdatingLocation/-stopUpdatingLocationが使用される方法ではありません。方法は何回ですか?ロカを取得したいだけの場合ユーザがボタンをタップしたときにCLLocationManagerのままにしておき、ユーザがボタンをタップするとCLLocationMangerlocationプロパティをチェックするだけです。

デリゲートメソッドに複数の呼び出しを避けるためにしようとしている理由は、消費電力などを心配しているので、のようなものでCLLocationManagerdesiredAccuracyプロパティを調整している場合:locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters

@interface YourController : NSObject <CLLocationManagerDelegate> 

@property (nonatomic, retain) CLLocationManager *locationMgr; 
@property (nonatomic, retain) CLLocation *lastLocation; 

- (IBAction)getNewLocation:(id)sender; 

@end 

.mファイル:

@interface YourController 

@synthesize locationMgr = _locationMgr; 
@synthesize lastLocation = _lastLocation; 

- (id)init 
{ 
    if (self = [super init]) { 
     self.locationMgr = [[CLLocationManager alloc] init]; 
     self.locationMgr.desiredAccuracy = kCLLocationAccuracyBest; 
     self.locationMgr.delegate = self; 
    } 
    return self; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    if (!self.lastLocation) { 
     self.lastLocation = newLocation;   
    } 

    if (newLocation.coordinate.latitude != self.lastLocation.coordinate.latitude && 
     newLocation.coordinate.longitude != self.lastLocation.coordinate.longitude) {   
     self.lastLocation = newLocation; 
     NSLog(@"New location: %f, %f", 
       self.lastLocation.coordinate.latitude, 
       self.lastLocation.coordinate.longitude); 
     [self.locationMgr stopUpdatingLocation]; 
    } 
} 

- (IBAction)getNewLocation:(id)sender 
{ 
    [self.locationMgr startUpdatingLocation]; 
    NSLog(@"Old location: %f, %f", 
      self.lastLocation.coordinate.latitude, 
      self.lastLocation.coordinate.longitude); 
} 

- (void)dealloc 
{ 
    [self.locationMgr release]; 
    self.locationMgr = nil; 
    [self.lastLocation release]; 
    self.lastLocation = nil; 
    [super dealloc]; 
} 

@end 
+0

ありがとうございます。だから、もし私がstopUpdatingLocationを削除し、アプリケーションが自動的に場所を更新し、また、ユーザーがbutton.Am私は右をタップしますか? – Neelesh

+0

いいえ、アプリケーションは自動的に場所の更新を開始します*。私はより明確にこれを示すために私の答えを編集します... – GarlicFries

+0

しかし、私は、ユーザが位置情報の更新を開始したい..私はドン – Neelesh

0

はあなたに#import <CoreLocation/CoreLocation.h>フレームワークが含まれていると仮定してる

すべてが...それは次のようになります、

.hファイルに語りました一緒にいる。これは、あなたが場所の更新を取得する方法です。

CLLocationManager *locationMgr = [[CLLocationManager alloc] init]; 
locationMgr.desiredAccuracy = kCLLocationAccuracyBest; 
locationMgr.delegate = self; 

[locationMgr startUpdatingLocation]; 

ここで正しいです。この後、あなたはここで、この中に、位置情報の更新を取得を開始、将来の参考のために

-(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation 
{ 
    // Handle location updates 
} 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    // Handle error 
} 
関連する問題