2012-01-15 14 views
1

私はアプリケーションにGPSを統合するためにtutorialに従っています。私はLatitudeLongitudeの値をviewDidLoadメソッドで表示したいと思います。チュートリアルによると、彼らは別の方法からそれを表示しています。しかし、それはviewDidLoadに表示する必要があります。 viewDidLoadに表示するには、次のコードを変更するにはどうすればよいですか?私のアプリケーションにGPSを統合する

HelloThereController.h

ビューコントローラ

#import "MyCLController.h" 

@interface HelloThereViewController : UIViewController <MyCLControllerDelegate> { 
    MyCLController *locationController; 
} 

- (void)locationUpdate:(CLLocation *)location; 
- (void)locationError:(NSError *)error; 

@end 

HelloThereController.mビューコントローラ

#import "HelloThereViewController.h" 

@implementation HelloThereViewController 

- (void)viewDidLoad { 
    locationController = [[MyCLController alloc] init]; 
    locationController.delegate = self; 
    [locationController.locationManager startUpdatingLocation]; 

    //I need to print the latitude and logitude values here.. 
} 

マイMyCLController.hクラス

@protocol MyCLControllerDelegate 
@required 
- (void)locationUpdate:(CLLocation *)location; 
- (void)locationError:(NSError *)error; 
@end 

@interface MyCLController : NSObject { 
    CLLocationManager *locationManager; 
    id delegate; 
} 

@property (nonatomic, retain) CLLocationManager *locationManager; 
@property (nonatomic, assign) id delegate; 

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

- (void)locationManager:(CLLocationManager *)manager 
     didFailWithError:(NSError *)error; 

@end 

マイMyCLController.mクラス

#import "MyCLController.h" 

@implementation MyCLController 

@synthesize locationManager; 
@synthesize delegate; 

- (id) init { 
    self = [super init]; 
    if (self != nil) { 
     self.locationManager = [[[CLLocationManager alloc] init] autorelease]; 
     self.locationManager.delegate = self; 
    } 
    return self; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation 
{ 
    [self.delegate locationUpdate:newLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
     didFailWithError:(NSError *)error 
{ 
    [self.delegate locationError:error]; 
} 

- (void)dealloc { 
    [self.locationManager release]; 
    [super dealloc]; 
} 

@end 
+1

locationManagerが作成されるとすぐに利用可能な現在の場所に依存することはできません。「locationManager.location」はnilかもしれません。あなたがショーにリンクしたチュートリアルのように、ロケーションマネージャのデリゲートからこれを行う方がはるかに優れています。 –

+0

ええ、それは私に0を与えます。しかし、私はviewDidLoadでそのデータを使用する必要があります。このための回避策はありますか?私もviewDidAppearでこれを追加しようとしましたが、viewDidLoadに表示しようとしましたが、同じ結果を返します – Illep

+0

電話がどこにあるのかわからない場合は、その位置を決定するのに数秒かかるでしょう - それはちょうど方法ですです。 –

答えて

2

このビューコントローラーがアプリケーションの読み込み後すぐに読み込まれる場合、できません。 ロケーションマネージャがgpsアップデートを取得するには時間がかかります。

UIActivityIndi​​catorViewなどの場所を取得していることをユーザーに知らせるUiコンポーネントを表示し、取得時に座標を表示する別の方法を設定する必要があります。

0

一般的に、desiredAccuracyプロパティを設定する精度を犠牲にして、プロセスを高速化できます。文書によると、値は次のとおりです。

kCLLocationAccuracyBestForNavigation 
kCLLocationAccuracyBest 
kCLLocationAccuracyNearestTenMeters 
kCLLocationAccuracyHundredMeters 
kCLLocationAccuracyKilometer 
kCLLocationAccuracyThreeKilometers 

とにかくあなたが最初の場所に興味を持っているので、まだマニュアルに従って:

高精度の位置データを要求する場合、最初のイベントがでお届け場所 サービスは、あなたが要求した正確さを持たない場合があります。 ロケーションサービスは、できるだけ早く、最初の イベントを配信します。その後、正確な位置を決定するために、 を要求し、必要に応じてそのデータが利用可能になったときに追加のイベントを配信します。

AppDelegate didFinishLaunchingWithOptionsでロケーションマネージャを起動して、ビューが表示されるまでに時間をもうけることができます。 Frederick Cheungによると、locationManager.locationにはnilを指定することができますので、ロケーションマネージャの代理での操作はより適切です。

関連する問題