1

我的 appDelegate 中有一个方法,它获取纬度和经度并返回一个我可以在任何 viewController 中使用的字符串。

应用代理

-(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。现在在我的 viewController 我调用这个方法:

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

但是我撞车了

str = [str stringByAppendingString:strLatitude];  

returnLatLongString.

我知道我正在崩溃,因为当时strLatitude没有价值。但是我该如何解决这个问题?我怎样才能获得更新的纬度和经度值?

另外,我不想在 viewControllers 中使用locationManager。为了让我可以在所有视图控制器中获取当前位置,我在 appDelegate 中完成了它。

4

5 回答 5

5

崩溃可能是因为str它是一个 NSString,因此它是不可变的。在这种情况下将其分配回自身是有问题的。使用会更简单stringWithFormat

NSString *str = [NSString stringWithFormat: @"lat=%@&long=%@", strLatitude, strLongitude];
于 2012-04-17T12:41:23.000 回答
0

AppDelegate您在创建Class对象时犯了一个错误。

要创建对象,只需编写以下代码:

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

完成..

于 2012-04-17T12:38:43.540 回答
0

导入您的 AppDelegate.h 文件。然后
使用以下代码:

MyAppDelegate *myAppDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *result = [myAppDelegate returnLatLongString];
于 2012-04-17T12:40:10.030 回答
0

我认为您需要在您的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中初始化这些变量(strLatitude,strLongitude)。如果它第一次达到这一点,它们不会被初始化,所以你会崩溃。

于 2012-04-17T14:55:32.383 回答
0

您的代码中有两个潜在问题。

首先确保在头文件中声明strLatitudestrLongitude作为strong属性:

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

用于@synthesize为它们自动生成正确的 getter 和 setter,并为它们分配正确的值:

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对象。

其次,在[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.

希望这可以帮助...

于 2012-04-17T15:08:41.720 回答