Расположение и заголовок не работает - PullRequest
0 голосов
/ 01 октября 2011

Я скачал исходный код этого учебника и немного поиграл с ним. Все работает нормально.

Теперь я хотел создать свой собственный проект для реализации местоположения и заголовка. Но после написания всего не получается. Я даже не вижу индикацию GPS наверху.

Когда я запускаю другое приложение, все в порядке. XCode не дает никаких ошибок или предупреждений.

мой код: (это ничего не изменило в AppDelegate).

LocationAndHeadingTestViewController.h

#import <UIKit/UIKit.h>
#import "LocationController.h"

@interface LocationAndHeadingTestViewController : UIViewController <LocationControllerDelegate>
{
    LocationController *_locationController;

    IBOutlet UILabel *_errorLabel;

    //Location
    IBOutlet UILabel *_locationTimeLabel;
    IBOutlet UILabel *_latitudeLabel;
    IBOutlet UILabel *_longitudeLabel;
    IBOutlet UILabel *_altitudeLabel;

    //Heading
    IBOutlet UILabel *_headingTimeLabel;
    IBOutlet UILabel *_trueHeadingLabel;
    IBOutlet UILabel *_magneticHeadingLabel;
    IBOutlet UILabel *_headingAccuracyLabel;

    IBOutlet UIImageView *_compass;
}

@property (nonatomic, retain) LocationController *locationController;

@end

LocationAndHeadingTestViewController.m

#import "LocationAndHeadingTestViewController.h"

@implementation LocationAndHeadingTestViewController

@synthesize locationController = _locationController;

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    _locationController = [LocationController new];
    _locationController.delegate = self;
    [_locationController.locationManager startUpdatingLocation];
    [_locationController.locationManager startUpdatingHeading];
}


- (void)locationUpdate:(CLLocation *)location 
{
    [_locationTimeLabel setText:[NSString stringWithFormat:@"%@", location.timestamp]];
    [_latitudeLabel setText:[NSString stringWithFormat:@"%f", location.coordinate.latitude]];
    [_longitudeLabel setText:[NSString stringWithFormat:@"%f", location.coordinate.longitude]];
    [_altitudeLabel setText:[NSString stringWithFormat:@"%f", [location altitude]]];
}

- (void)headingUpdate:(CLHeading *)heading
{
    [_headingTimeLabel setText:[NSString stringWithFormat:@"%@", heading.timestamp]];
    [_trueHeadingLabel setText:[NSString stringWithFormat:@"%f", heading.trueHeading]];
    [_magneticHeadingLabel setText:[NSString stringWithFormat:@"%f", heading.magneticHeading]];
    [_headingAccuracyLabel setText:[NSString stringWithFormat:@"%f", heading.headingAccuracy]];
}

- (void)locationError:(NSError *)error 
{
    _errorLabel.text = [error description];
}

- (void)didReceiveMemoryWarning 
{
    [super didReceiveMemoryWarning];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)viewDidUnload 
{
    [super viewDidUnload];
}

- (void)dealloc 
{
    [_locationController release];
    [super dealloc];
}

@end

LocationController.h

#import <CoreLocation/CoreLocation.h>

@protocol LocationControllerDelegate
@required

- (void)locationUpdate:(CLLocation *)location;
- (void)headingUpdate:(CLHeading *)heading;
- (void)locationError:(NSError *)error;

@end

@interface LocationController : NSObject <CLLocationManagerDelegate>
{
    CLLocationManager *_locationManager;
    id _delegate;
}

@property (nonatomic, retain) CLLocationManager *locationManager;
@property (nonatomic, assign) id delegate;

@end

LocationController.m

#import <CoreLocation/CoreLocation.h>
#import "LocationController.h"

@implementation LocationController

@synthesize locationManager = _locationManager, delegate = _delegate;

- (id)init
{
    if(self = [super init]) 
    {
        _locationManager = [[CLLocationManager new] autorelease];
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        _locationManager.delegate = self;
    }

    return self;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{
    if([self.delegate conformsToProtocol:@protocol(LocationControllerDelegate)]) 
    {
        [self.delegate locationUpdate:newLocation];
    }
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{
    if([self.delegate conformsToProtocol:@protocol(LocationControllerDelegate)]) 
    {
        [_delegate locationError:error];
    }
}

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
{
    if([self.delegate conformsToProtocol:@protocol(LocationControllerDelegate)]) 
    {
        [_delegate headingUpdate:newHeading];
    }
}

- (void)dealloc 
{
    [_locationManager release];
    [super dealloc];
}

@end

Это довольно просто, но я думаю, что действительно что-то упускаю.

Ps. Я изменю идентификатор делегата на идентификатор <..> делегат

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Вы не должны автоматически высвобождать объект CLLocationManager:

_locationManager = [[CLLocationManager new] autorelease];

Это свойство "retain".Вам нужно удалить авто-релиз, вы собираетесь выпустить его в dealloc.Вы можете разблокировать его только один раз.

Если бы вы присвоили его с помощью установщика, то установщик сохранил бы его для вас.Как это было бы хорошо:

self.locationManager = [[CLLocationManager new] autorelease];
0 голосов
/ 01 октября 2011

Ваше приложение включено для службы определения местоположения в настройках iPhone?

Служба определения местоположения (глобальный доступ) может быть включена, но вашему конкретному приложению в настройках службы определения местоположения также может быть отказано в доступе к местоположению одновременно.

...