2012-04-17 13 views
1

私はappDelegateに緯度と経度を取得し、viewControllerで使用できる文字列を返すメソッドを持っています。AppDelegateから現在の位置を取得

AppDelegate

-(void)StartUpdating 
{  
    locManager = [[CLLocationManager alloc] init]; 
    locManager.delegate = self; 
    locManager.distanceFilter = kCLDistanceFilterNone; // whenever we move 
    locManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m 
    [locManager startUpdatingLocation]; 
} 

#pragma mark 
#pragma mark locationManager delegate methods 


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

    float latitude = newLocation.coordinate.latitude; 
    strLatitude = [NSString stringWithFormat:@"%f",latitude]; 
    float longitude = newLocation.coordinate.longitude; 
    strLongitude = [NSString stringWithFormat:@"%f", longitude]; 
    //[self returnLatLongString:strLatitude:strLongitude]; 

} 

-(NSString*)returnLatLongString 
{  
    NSString *str = @"lat="; 
    str = [str stringByAppendingString:strLatitude]; 
    str = [str stringByAppendingString:@"&long="]; 
    str = [str stringByAppendingString:strLongitude]; 

    return str; 
} 

私は、アプリケーションの起動にStartUpdatingを呼び出しています。

AppDelegate *appDelegate=[AppDelegate sharedAppDelegate]; 
NSString *str = [appDelegate returnLatLongString]; 

しかし、私はreturnLatLongString

str = [str stringByAppendingString:strLatitude]; 

でクラッシュを取得:今私のViewControllerに私は、このメソッドを呼び出します。

その時点ではstrLatitudeに値がないので、私はクラッシュしていることを知っています。しかし、どうすればこの問題を解決できますか?緯度と経度の値を更新するにはどうすればいいですか?

また、私はlocationManagerをviewControllerに使用したくありません。私はすべてのviewControllerで現在の位置を取得できるように、appDelegateでそれを行いました。

答えて

4

クラッシュがあるかもしれません。この場合、それ自体をそれに割り当てることは問題である。ちょうどstringWithFormatを使用する方が簡単だろう:

NSString *str = [NSString stringWithFormat: @"lat=%@&long=%@", strLatitude, strLongitude]; 
0
あなたは AppDelegateクラスのオブジェクトを作成すると間違いをしている

..

はただ書くこのコードオブジェクトを作成するには:

AppDelegate *appDelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSString *str = [appDelegate returnLatLongString]; 

をその行わ..

+0

を助けます;'私は著者が正しいことをしたと思う:[[のUIApplication 'リターン(AppDelegate *)のようにsharedApplicationからデリゲートを返すためにsharedApplication]デリゲート]; '。 –

0

インポートあなたのAppDelegate.hファイル。その後
は、次のコードを使用します。strはNSStringのであり、そのため変更できませんので

MyAppDelegate *myAppDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSString *result = [myAppDelegate returnLatLongString]; 
0

私はあなたがあなたの - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法でこれらの変数(strLatitude、strLongitude)をinitにする必要があると思います。初めてこの点に当たると、初期化されずクラッシュすることになります。

+0

OPがstrLatitudeとstrLongitudeをivarsとして定義している可能性があります。そうしないと、アプリケーションは最初にビルドされません。 –

0

コードに2つの潜在的な問題があります。自動的にそれらのための適切なゲッターとセッターを生成して、それらに適切な値を割り当てるために

@property (nonatomic, strong) NSString * strLatitude;  
@property (nonatomic, strong) NSString * strLongitude; 

使用@synthesize

まず第一に、あなたのヘッダファイル内strongプロパティとしてstrLatitudestrLongitudeを宣言することを確認してください:

float latitude = newLocation.coordinate.latitude; 
self.strLatitude = [NSString stringWithFormat:@"%f",latitude]; 
float longitude = newLocation.coordinate.longitude; 
self.strLongitude = [NSString stringWithFormat:@"%f", longitude]; 

[NSString stringWithFormat:]戻りますので、彼らは値が割り当てられた後、彼らは解放されませんことを確認するautoreleased個のオブジェクト。

第2に、[locManager startUpdatingLocation];の後に、システムが最初の位置更新を配信する前にいつかかかります。したがって、別の文字列を作成する前に、strLatitudestrLongitudeにすでに値が割り当てられているかどうかを確認する必要があります。これに似た何かが仕事をする必要があります。

-(NSString*)returnLatLongString 
{ 
    if (self.strLatitude == nil || self.strLongitude == nil) 
     return nil; 

    NSString *str = @"lat="; 
    str = [str stringByAppendingString:strLatitude]; 
    str = [str stringByAppendingString:@"&long="]; 
    str = [str stringByAppendingString:strLongitude]; 

    return str; 
} 

その後の進路[AppDelegate returnLatLongString]を使用しようとしているビューコントローラは、返された値がnilではないことを確認する必要があります。

希望これは* appDelegate = [AppDelegate sharedAppDelegate] ... AppDelegate `で

関連する問題