iOS地图标记和当前位置未显示

时间:2014-12-07 07:21:25

标签: ios objective-c mapkit cllocationmanager location-services

我有一个导入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.
}




2 个答案:

答案 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上,他们改变了您要求位置许可的方式。您现在需要拨打startUpdatingLocationrequestWhenInUseAuthorization,而不是只能拨打requestAlwaysAuthorization

相关问题