2013-09-20 2 views
0

Я новый в мире Objective-C. Я пытаюсь разработать приложение для простого определения местоположения на iOS 6.1 на симуляторе. Но когда я пытаюсь имитировать местоположение, он вообще не работает. Я не получаю никакого события, но delegate объект зарегистрирован должным образом и PositionProvider - startUpdate.CLLocationManager не получает обновлений

Что не так?

я следующий код:

PositionProvider

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 
#import "LocationListener.h" 

@interface PositionProvider : NSObject 
{ 
    @public 
    LocationListener<CLLocationManagerDelegate> *listener; 
    @protected 
    CLLocationManager *manager; 
} 

#pragma mark - 
#pragma mark on/off 

-(void) startUpdate; 

-(void) stopUpdate; 

@end 

Реализация

@implementation PositionProvider 
{ 
@private 
    CLLocation *lastLocation; 
} 

-(void) startUpdate{ 
    manager = [[CLLocationManager alloc] init]; 

    LocationListener *listener2 = [[LocationListener alloc]init]; 

    manager.delegate = listener2; 
    manager.desiredAccuracy = kCLLocationAccuracyBest; 

    if(manager == nil) 
     NSLog(@"Manager is NULL"); 

    if(listener == nil || manager.delegate == nil) 
     NSLog(@"Listener is NULL"); 

    NSLog(@"startUpdate"); 

    if ([CLLocationManager locationServicesEnabled]) { 
     NSLog(@"Location Services Enabled"); 
     switch ([CLLocationManager authorizationStatus]) { 
      case kCLAuthorizationStatusAuthorized: 
       NSLog(@"We have access to location services"); 
       break; 
      case kCLAuthorizationStatusDenied: 
       NSLog(@"Location services denied by user"); 
       break; 
      case kCLAuthorizationStatusRestricted: 
       NSLog(@"Parental controls restrict location services"); 
       break; 
      case kCLAuthorizationStatusNotDetermined: 
       NSLog(@"Unable to determine, possibly not available"); 
       break; 
      default: 
       break; 
     } 
    } 
    else { 
     NSLog(@"Location Services Are Disabled"); 
    } 

    [manager startUpdatingHeading]; 
    [manager startUpdatingLocation]; 

} 

-(void) stopUpdate{ 



} 

@end 

LocationListener

@interface LocationListener : NSObject<CLLocationManagerDelegate> 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations; 



    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status; 

@end 

Реализация

@implementation LocationListener 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 

// newLocation.coordinate; 

    NSLog(@"Logging Location"); 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ 

    NSLog(@"Logging Location"); 
} 

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus) status{ 


    NSLog(@"Status"); 
} 

@end 
+0

Почему он есть переменная с именем Listener2 и другие (Ивар) с именем слушателя? – tdelepine

+0

@tdelepine Он был изменен только в целях отладки. Но это все еще не работает. – user902691

+0

Используете ли вы сеть Wi-Fi, иногда неправильное местоположение пользователя? В этом случае необходимо зайти в меню симулятора и установить больше раз местоположение – tdelepine

ответ

0

Вы пробовали

[manager setDelegate:listener2]; 

В качестве альтернативы, вы можете иметь проблемы управления памятью. Попробуйте добавить метод dealloc с отладчиком-точки останова и увидеть, если она вызывается прежде, чем вы ожидали:

- (void)dealloc { 
    NSLog(@"Dealloc called"); 

    self.locationManager = nil; 
} 
Смежные вопросы