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



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

然后,我根据以下建议为CLLocationManager设置了一个委托:

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

@interface ViewController : UIViewController <CLLocationManagerDelegate>

上面列出的代码行显示了用于显示 ViewController 采用 CLLocationManagerDelegate 协议的语法。我们只需将其添加到标题@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

我对从这里去哪里感到困惑。假设到目前为止我甚至正确地执行了所有操作(是吗?),那么我如何访问存储在名为位置的 NSArray 对象中的位置数据?

谢谢你的帮助。

欢迎来到 iOS 社区!

首先,您可能会发现查看 CLLocationManagerDelegate 引用(在locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)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 出口以图形方式连接到界面生成器中的某些内容。

如果您熟悉其他编程语言,这是推拉的区别。 CLLocationManager 提供了一个推送模型(它调用您的locationManager:didUpdateLocations:方法来立即通知您更改),还有一个拉取模型(您可以随时通过.location向其询问最新位置)。 您使用哪一个将取决于您要做什么。