我是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对象中的位置数据呢?
感谢您的帮助。
答案 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
的当前位置)。你使用哪一个取决于你想做什么。