我有一个导入SWRevealViewController的MapViewController,老实说,我没有在下面编写这些代码。我试图运行应用程序,但不幸的是地图没有显示当前位置,即使应用程序被授予访问GPS的权限,即使位置服务也没有打开电话。由于我并不期望iOS开发,我需要有人查看代码并解释此代码中缺少的内容。我看了类似的问题,但即使对于学习Objective-c的人来说,他们似乎也很直接。我假设这个代码的问题是这里导入的SWRevealViewController,我认为这是一个库或者我不知道的东西。
#import "MapViewController.h"
#import "SWRevealViewController.h"
// New York
#define NY_LATITUDE 40.754445
#define NY_LONGITUDE -73.977364
// Span and distance
#define SPAN_VALUE 1.0f
#define DISTANCE 500
@interface MapViewController ()
- (void)startLocationServices;
- (void)stopLocationServices;
@end
@implementation MapViewController
@synthesize locationManager;
@synthesize gpsDisplay;
@synthesize mapk;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (IBAction)sendRequest:(id)sender {
[self alertStatus:@"An assistance request has been sent, you will be contacted shortly." :@"Send assistance request" :0];
[self performSegueWithIdentifier:@"sendRequest" sender:nil];
}
- (void) alertStatus:(NSString *)msg :(NSString *)title :(int) tag
{
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
message:msg
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil, nil];
alertView.tag = tag;
[alertView show];
}
-(void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex: (NSInteger)buttonIndex
{
if(buttonIndex==0)
{
//NSLog(@"OK Clicked");
// [self alertStatus:@"An assistance request has been sent, you will be contacted shortly. " :@"I just had an accident" :0];
// [self performSegueWithIdentifier:@"checkProgress" sender:nil];
}}
- (void)viewDidLoad
{
[super viewDidLoad];
[self startLocationServices];
if ([CLLocationManager locationServicesEnabled]) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
} else {
NSLog(@"Location services are not enabled");
}
// Set a timer to stop the Location services
//[NSTimer scheduledTimerWithTimeInterval:100.0 target:self selector:@selector(stopLocationServices) userInfo:nil repeats:NO];
_sidebarButton.tintColor = [UIColor colorWithWhite:0.1f alpha:0.9f];
// Set the side bar button action. When it's tapped, it'll show up the sidebar.
_sidebarButton.target = self.revealViewController;
_sidebarButton.action = @selector(revealToggle:);
// Set the gesture
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
// CLLocationManager *cllocationManager = [[CLLocationManager alloc] init];
// cllocationManager.delegate = self;
// cllocationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
// cllocationManager.distanceFilter = 20.0f;
//
// if ([CLLocationManager locationServicesEnabled])
// {
// [cllocationManager startUpdatingLocation];
// }
// else
// {
// UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Turn On Location Services to find your location"
// message:nil delegate:nil
// cancelButtonTitle:@"OK"
// otherButtonTitles:nil];
// [alert show];
// // [alert release];
// }
}
- (IBAction)mapChanger:(id)sender {
switch (((UISegmentedControl *) sender).selectedSegmentIndex) {
case 0:
self.mapk.mapType = MKMapTypeStandard;
break;
case 1:
self.mapk.mapType = MKMapTypeSatellite;
break;
case 2:
self.mapk.mapType = MKMapTypeHybrid;
break;
default:
break;
}
}
- (void)startLocationServices
{
// create the Location Manager
if (self.locationManager == nil) {
self.locationManager = [CLLocationManager new];
}
// settings
[self.locationManager setDelegate:self];
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[self.locationManager setDistanceFilter:kCLDistanceFilterNone];
// start services
[self.locationManager startUpdatingLocation];
self.gpsDisplay.text = @"Location Service started.";
}
- (void)stopLocationServices
{
// stop services
[self.locationManager stopUpdatingLocation];
[self.locationManager setDelegate:nil];
self.gpsDisplay.text = @"Location Services stopped.";
}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
CLLocationCoordinate2D loc = [userLocation coordinate];
// CLLocationDistance in meters (1 meter = 3.3 feet)
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, DISTANCE, DISTANCE);
[mapView setRegion:region animated:YES];
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSString *coords =@"lat";
coords = [coords stringByAppendingString:[NSString stringWithFormat:@"%f", newLocation.coordinate.latitude]];
coords = [coords stringByAppendingString:@"lon"];
coords = [coords stringByAppendingString:[NSString stringWithFormat:@"%f", newLocation.coordinate.longitude]];
self.gpsDisplay.text = coords;
MKCoordinateRegion region;
region.center.latitude = newLocation.coordinate.latitude;
region.center.longitude = newLocation.coordinate.longitude;
region.span.latitudeDelta = SPAN_VALUE;
region.span.longitudeDelta = SPAN_VALUE;
[self.mapk setRegion:region animated:YES];
}
- (void)viewDidUnload {
//[self setUpdates:nil];
[super viewDidUnload];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

答案 0 :(得分:1)
除了上一个答案,请注意您必须指定访问用户位置信息的原因,将相对密钥(NSLocationAlwaysUsageDescription或NSLocationWhenInUseUsageDescription)添加到项目的Info.plist
例如:
<key>NSLocationWhenInUseUsageDescription</key>
<string>Location is required to find out jobs around you are</string>
答案 1 :(得分:0)
在iOS 8上,他们改变了您要求位置许可的方式。您现在需要拨打startUpdatingLocation
或requestWhenInUseAuthorization
,而不是只能拨打requestAlwaysAuthorization
。