我编写了一个简单的iPhone应用程序,用于检索位置信息并简单地显示它们。
我想在每次位置更改时增加distanceTraveled
变量。
我的问题是,在locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
方法中,locations.count
始终等于1。我以为每次调用该方法时都会在数组中添加一个元素,但似乎不是那样...
我正在模拟器中运行该应用程序(我现在没有设备)。
这是我的代码:
// BIDViewController.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface BIDViewController : UIViewController <CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *startingPoint;
@property (strong, nonatomic) IBOutlet UILabel *latitudeLabel;
@property (strong, nonatomic) IBOutlet UILabel *longitudeLabel;
@property (strong, nonatomic) IBOutlet UILabel *horizontalAccuracyLabel;
@property (strong, nonatomic) IBOutlet UILabel *altitudeLabel;
@property (strong, nonatomic) IBOutlet UILabel *verticalAccuracyLabel;
@property (strong, nonatomic) IBOutlet UILabel *distanceTraveledLabel;
@end
// BIDViewController.m :
#import "BIDViewController.h"
@interface BIDViewController ()
@property (strong, nonatomic)CLLocation *currentLocation;
@property (strong, nonatomic)CLLocation *lastLocation;
@property CLLocationDistance distanceTraveled;
@end
@implementation BIDViewController
@synthesize latitudeLabel;
@synthesize locationManager;
@synthesize longitudeLabel;
@synthesize startingPoint;
@synthesize altitudeLabel;
@synthesize distanceTraveledLabel;
@synthesize horizontalAccuracyLabel;
@synthesize verticalAccuracyLabel;
@synthesize currentLocation;
@synthesize lastLocation;
@synthesize distanceTraveled;
- (void)viewDidLoad
{
[super viewDidLoad];
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//locationManager.distanceFilter = 10.0f;
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
if (startingPoint == nil) {
startingPoint = [locations lastObject];
NSLog(@"first time -- locations.count = %d", locations.count);
distanceTraveled = 0;
distanceTraveledLabel.text = @"0m";
}
else if (locations.count > 1) {
NSLog(@"into the else if -- locations.count = %d", locations.count);
lastLocation = locations[locations.count -2];
distanceTraveled = distanceTraveled + [currentLocation distanceFromLocation:lastLocation];
distanceTraveledLabel.text = [NSString stringWithFormat:@"%gm", distanceTraveled];
}
NSLog(@"locations.count = %d", locations.count);
currentLocation = [locations lastObject];
latitudeLabel.text =
[NSString stringWithFormat:@"%g\u00B0", currentLocation.coordinate.latitude];
longitudeLabel.text =
[NSString stringWithFormat:@"%g\u00B0", currentLocation.coordinate.longitude];
horizontalAccuracyLabel.text =
[NSString stringWithFormat:@"%gm", currentLocation.horizontalAccuracy];
verticalAccuracyLabel.text =
[NSString stringWithFormat:@"%gm", currentLocation.verticalAccuracy];
altitudeLabel.text =
[NSString stringWithFormat:@"%gm", currentLocation.altitude];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSString *errorString = [[NSString alloc] init];
switch (error.code) {
case kCLErrorLocationUnknown:
errorString = @"Location unknown";
break;
case kCLErrorDenied:
errorString = @"Access denied";
break;
case kCLErrorNetwork:
errorString = @"No network coverage";
break;
case kCLErrorDeferredAccuracyTooLow:
errorString = @"Accuracy is too low to display";
break;
default:
break;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error getting location"
message:errorString
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
@end
这是记录器的外观:
2012-11-21 11:28:34.882 WhereAmI[652:11c03] first time -- locations.count = 1
2012-11-21 11:28:34.897 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:35.835 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:36.835 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:37.836 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:38.836 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:39.837 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:40.837 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:41.838 WhereAmI[652:11c03] locations.count = 1
2012-11-21 11:28:42.839 WhereAmI[652:11c03] locations.count = 1
等等...
有什么建议吗?谢谢大家,一如既往地感谢您的英语不好!
最佳答案
模拟器不会返回一个以上的位置,因为它使用的是您的计算机所在的位置,因此您可以获得Wi-Fi的精度,仅此而已,除非在运行它时切换到其他位置的另一个Wi-Fi网络,否则它永远不会返回更高的精度/不同的位置。
如果您正在移动的实际设备上进行测试,或者该设备首先为您提供了信号塔的精度,然后是Wi-Fi,然后是GPS精度,那么您将在阵列中收到多个位置。
希望这可以解决。
关于ios - iO(CoreLocation)-locationManager:didUpdateLocations:无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13491594/