iphone gps cllocation并使变量可全局访问

时间:2009-11-02 06:56:09

标签: iphone objective-c

我对iPhone开发很新,并且一直在努力研究如何将GPS信息包含到我正在使用的应用程序中。   我已经完成了HelloThere教程,这是一个很好的开始

http://www.mobileorchard.com/hello-there-a-corelocation-tutorial/

在我的iPhone上运行它没有任何问题。然后我采用了这个例子,从那以后一直试图将GPS信息整合到一个更大更复杂的应用程序中。较大的应用程序有一个现有的函数,它将向服务器发送一个post请求,我想简单地提供位置数据,特别是coordinate.latitude和coordinate.longitude到这个函数,如果可能的话,不改变它。 />   在我使用过的其他语言中,这是微不足道的,但事实证明它在目标C中非常具有挑战性   基本上,根据教程我已经到了我记录位置信息的地步,


//GPS stuff
- (void)locationUpdate:(CLLocation *)location {
 //locationLabel.text = [location description];
 locationString = [location description];
 locationLabel.text = locationString;
 locLat  = [NSString stringWithFormat:@"%lf", location.coordinate.latitude];
 locLong = [NSString stringWithFormat:@"%lf", location.coordinate.longitude];
}

但我无法弄清楚如何使locLat和locLong变量可用于应用程序的其他部分。相当蹩脚,但我仍然有点失去了客观的C。

2 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。快速而肮脏的方式(有些人会皱眉)就是在这个文件中将它们声明为全局变量并使用extern从其他文件中访问它们。

最好是创建类的@properties,并提供一个getter,以便您可以从另一个类或应用程序的一部分访问它们。这确实假设此类可供其他类稍后访问。

您还可以使用委托来获取信息。和...

多思考一下,我可能会在其他地方存储这样的数据,并且会使用这个例程更新该位置的值(通过使用该类的setter),所以这里的方法只是得到位置和然后把它存放在别处。

你可能想阅读Scott Knaster的关于Objective C和Mac开发的书,以获得关于Obj C的入门知识。

答案 1 :(得分:0)

以下是我推荐的方式:

将lat / long存储在字典中,并将其作为通知中捆绑的字符串触发。在应用程序委托中设置观察者并让回调函数在应用程序委托的类属性中存储lat / long和/或将它们存储在应用程序默认值中。

在您获得坐标的班级中:

- (void)locationUpdate:(CLLocation *)location {
    NSString *locationString, *locLat, *locLong;
    locationString = [location description];
    locLat  = [NSString stringWithFormat:@"%lf", location.coordinate.latitude];
    locLong = [NSString stringWithFormat:@"%lf", location.coordinate.longitude];
    NSDictionary *locationDictionary = [NSDictionary dictionaryWithObjectsAndKeys:locationString, @"description", 
                    locLat, @"latitude", locLong, @"longitude", nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"updateSearchLocation" 
                    object:self userInfo:locationDictionary];
}

在您的应用程序委托类中:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // Listen for search coordinates broadcast
    [[NSNotificationCenter defaultCenter] addObserver:self
                selector:@selector(setCoordinates:)
            name:@"updateSearchLocation" object:nil];
}

    - (void)setCoordinates:(id)sender {
        self.latitude = [[sender userInfo] objectForKey:@"latitude"];
        self.longitude = [[sender userInfo] objectForKey:@"longitude"];
        NSLog(@"location = %@", [[sender userInfo] objectForKey:@"description"]);

    }

不要忘记将应用程序委托头文件中的类属性设置为NSString。然后,您可以通过直接从应用程序委托中调用来访问坐标:

YourAppDelegateClassName *appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"lat = %@, long = %@", appDelegate.latitude, appDelegate.longitude);

或者您可以从用户默认设置访问它们:

[[NSUserDefaults standardUserDefaults] objectForKey:@"latitude"];
[[NSUserDefaults standardUserDefaults] objectForKey:@"longitude"];

我希望有所帮助。