需要访问包含CLLocation信息的NSArray对象

时间:2013-12-21 03:40:54

标签: ios iphone objective-c cllocationmanager cllocation

我是Objective-c的新手,并且在过去的两个半小时里一直试图解决这个问题。到目前为止,我已经取得了一些成功,我的应用程序可以在应用程序启动后立即开始搜索用户的位置。

然后我根据此建议设置CLLocationManager的委托:

“添加语法以声明此类(ViewController.h / m)正在采用此特定协议。默认情况下,创建此类实例的任何其他类也将自动采用该协议。

@interface ViewController : UIViewController <CLLocationManagerDelegate>

上面列出的代码行显示了用于显示ViewController采用CLLocationManagerDelegate协议的语法。我们只需将其添加到有角度的括号之间&lt;&gt;在标题中的@interface行。“

所以我在ViewController.m和ViewController.h文件中成功添加了上面的行,然后我也遵循了相同的教程建议:

“完整的方法是:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

并在实施时告诉代理新的位置数据可用。我们对这种方法有两个论点。第一个让你知道哪个CLLocationManager提供了更新,而最后一个提供了存储在NSArray中的CLLocation信息。“

下面是我的所有ViewController.h代码,接下来将是我的ViewController.m代码:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>


@interface ViewController : UIViewController <CLLocationManagerDelegate>

@property (nonatomic, strong) IBOutlet UILabel *gpsLabel;


-(IBAction)gpsButton;


@end

这是我的ViewController.m代码:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>


@property (nonatomic, strong) CLLocationManager * gpsLM;

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

@end

@implementation ViewController


- (void)viewDidLoad
{

[super viewDidLoad];

self.gpsLM = [[CLLocationManager alloc]init];

[self.gpsLM startUpdatingLocation];

}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

-(IBAction)gpsButton{

}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

}

@end

我很困惑从哪里开始。假设到目前为止我甚至正在做所有事情(是吗?),那么如何访问存储在名为locations的NSArray对象中的位置数据呢?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

欢迎来到iOS社区!

首先,您可能会发现在locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations方法的标题下查看CLLocationManagerDelegate引用会很有帮助。这里重要的是:

  

locations:包含位置数据的CLLocation对象数组。   此数组始终包含至少一个表示该对象的对象   当前位置。如果延迟更新或多个位置   在它们交付之前到达,阵列可能包含   其他条目。数组中的对象组织在   它们发生的顺序。因此,最近的位置   更新位于数组的末尾。

重要的是,当用户的位置发生变化时,系统会调用此方法。

因此,例如,您可以通过将实施更改为以下内容,在位置更新时向控制台打印消息:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *currentLocation = [locations lastObject];
    NSLog(@"Location is: %.5f %.5f", currentLocation.coordinate.latitude, currentLocation.coordinate.longitude);
}

如果您想要响应用户活动而做某事,可以使用manager.location,每次CLLocationManager检测到新位置时都会自动更新。 (如果这不存在,则需要在类中添加另一个实例变量来存储最近的位置,并在locationManager中更新:didUpdateLocations:。)

因此,例如,如果您想在按下按钮时使用当前位置更新标签,则可以添加以下内容:

-(IBAction)gpsButton {
    CLLocation *currentLocation = self.gpsLM.location;
    self.gpsLabel.text = [NSString stringWithFormat:@"Location is: %.5f, %.5f"];
}

(注意:这假设gpsButton操作和gpsLabel插件在Interface Builder中以图形方式连接到某些内容。)

如果您熟悉其他编程语言,那么这就是推动与拉动的区别。 CLLocationManager提供推送模型(它调用您的locationManager:didUpdateLocations:方法立即通知您更改),还提供 pull 模型(您可以询问它最多任何时候通过.location的当前位置)。你使用哪一个取决于你想做什么。