2012-07-28 8 views
8

callbacków więc teraz mam przynajmniej uzyskiwanie z następującego kodu ...CLLocationManager startUpdatingLocation nie działa

- (void)viewDidLoad { 

[super viewDidLoad]; 
mapView=[[MKMapView alloc] initWithFrame:self.view.frame]; 
//mapView.showsUserLocation=TRUE; 
mapView.delegate=self; 
[self.view insertSubview:mapView atIndex:0]; 

NSLog(@"locationServicesEnabled: %@", [CLLocationManager locationServicesEnabled] ? @"YES":@"NO"); 
    CLLocationManager *newLocationManager = [[CLLocationManager alloc] init]; 
    [newLocationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
    [newLocationManager setDistanceFilter:kCLDistanceFilterNone]; 
    [self setLocationManager:newLocationManager]; 


[[self locationManager] setDelegate:self]; 
[[self locationManager] startUpdatingLocation]; 
NSLog(@"Started updating Location"); 

} 


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

NSLog(@"Did update to location"); 
mStoreLocationButton.hidden=FALSE; 
location=newLocation.coordinate; 

MKCoordinateRegion region; 
region.center=location; 
MKCoordinateSpan span; 
span.latitudeDelta=0.01; 
span.longitudeDelta=0.01; 
region.span=span; 


[mapView setRegion:region animated:TRUE]; 


} 

mogę ustawić punkty przerwania w drugim sposobie i NSLog donosi ciągłe aktualizacje lokalizacji, ale z jakiegoś powodu zoom z przęsłem nie działa. Każdy pomysł, dlaczego? Ma moje współrzędne i wszystko. Rodzaj drapania mojej głowy w tym.

+0

kod ur wydaje się ok .. problem jest gdzie indziej – samfisher

+0

Czy masz te problemy w symulatorze? Czy włączono symulację lokalizacji? – HeikoG

+0

Tak, problemy z symulatorem. Mam włączoną lokalizację symulacji. Być może muszę przetestować go na urządzeniu. – Coltrane

Odpowiedz

15

Przypisz obiekt CLLocationManager do (silnej) właściwości w klasie. (Zakładam, że używasz ARC BTW.) W tej chwili menedżer CLLocationManager nie przeszedł końca metody viewDidLoad, więc nie będzie mógł również wywołać metody delegowania.

+0

Nie wydaje się, aby coś zmienić. Ponownie testuję na symulatorze. Przetestuje urządzenie w poniedziałek. – Coltrane

+0

Przepraszam, mój błąd. Masz dokładnie rację. Otrzymuję teraz wywołania zwrotne "zaktualizowałem do lokalizacji". Mój problem polega na tym, że powiększenie przy użyciu zakresu nie działa. Jakieś dalsze pomysły na ten temat? – Coltrane

+0

+1, pracował dla mnie. To był jedyny problem w moim przypadku. Twoje zdrowie. – viral

1

Przede wszystkim możesz nigdy upewnić się, że menedżer lokalizacji jest w stanie zaktualizować lokalizację w pierwszej kolejności. Podczas aktualizacji może wystąpić błąd lub nie masz dostępu do lokalizacji użytkownika.

Wprowadź w życie tę metodę delegata CLLocationManager i sprawdź błąd.

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 

"Wdrożenie tej metody jest opcjonalne. Należy wdrożenie tej metody, jednak".

+1

Nie zgłaszanie błędów. Próbuję tego testu na symulatorze iOS. Czy to może mieć z tym coś wspólnego? – Coltrane

5

myślę, można dokonać tej pracy przez dwa sposoby:

  1. Korzystanie ramowa CLLocation

Sprawdzić, masz przyjęło ViEWController metodami CLLocationManagerDelegate

#import<MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 

@interface ViewController : UIViewController <CLLocationManagerDelegate, 
               MKMapViewDelegate> 
{ 
    CLLocationCoordinate2D location; 
    MKMapView *mapView; 
} 
@end 

In ViewController.m:

@implementation GSViewController 
- (void)viewDidLoad { 

    [super viewDidLoad]; 
    mapView=[[MKMapView alloc] initWithFrame:self.view.frame]; 
    mapView.showsUserLocation=TRUE; 
    mapView.delegate=self; 
    [self.view insertSubview:mapView atIndex:0]; 


    CLLocationManager *locationManager=[[CLLocationManager alloc] init]; 
    locationManager.delegate=self; 
    locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters; 

    [locationManager startUpdatingLocation]; 

} 

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


    NSLog(@"new location: %@", newLocation); 
    location=newLocation.coordinate; 

    MKCoordinateRegion region; 
    region.center=location; 
    MKCoordinateSpan span; 
    span.latitudeDelta=0.01; 
    span.longitudeDelta=0.01; 
    region.span=span; 

    [mapView setRegion:region animated:TRUE]; 

} 


-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{ 
    NSLog(@"error: %@", error.description); 
} 
@end 

2.Using tej samej ramy MKMapKit Można to zrobić za pomocą metody MKMapViewDelegate nazwie didUpdateUserLocation: Tu nie trzeba CLLocaionManager, ta zostanie wykonana przez: W ViewController.h:

#import <MapKit/MapKit.h> 
@interface ViewController : UIViewController < MKMapViewDelegate> 
{ 
    CLLocationCoordinate2D location; 
    MKMapView *mapView; 
} 
@end 

i w pliku ViewController.m:

@implementation GSViewController 
- (void)viewDidLoad { 

    [super viewDidLoad]; 
    mapView=[[MKMapView alloc] initWithFrame:self.view.frame]; 
    mapView.showsUserLocation=TRUE; 
    mapView.delegate=self; 
    [self.view insertSubview:mapView atIndex:0]; 

} 

-(void)mapView:(MKMapView *)mapV didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    NSLog(@"map new location: %f %f", userLocation.coordinate.latitude, userLocation.coordinate.longitude); 
    location=userLocation.coordinate; 

    MKCoordinateRegion region; 
    region.center=location; 
    MKCoordinateSpan span; 
    span.latitudeDelta=0.1; 
    span.longitudeDelta=0.1; 
    region.span=span; 

    [mapV setRegion:region animated:TRUE]; 
} 
@end 
+0

Używając metody 1, otrzymuję wywołania zwrotne, ale zoom (zakres) nie jest powiększany do lokalizacji. Poprawiłem swój kod. Może spojrzeć i zobaczyć, czy coś jest nie tak? – Coltrane

13

upewnić się, że dodaliśmy <CLLocationManagerDelegate> w @interface plik.

Edit:

Jeżeli delegatem jest ustawiony prawidłowo, upewnij się, że używasz aĹ locationManager:

W pliku .h:

@property (nonatomic, strong) CLLocationManager *locationManager; 

W viewDidLoad:

self.locationManager = [[CLLocationManager alloc] init]; 
[self.locationManager setDelegate:self]; 
[self.locationManager startUpdatingLocation]; 
+2

To naprawi ostrzeżenia, nie wiele więcej. –

+0

Ja na pewno. – Coltrane

1

Jeśli używasz tego w symulatorze, może być konieczne monit o zmianę współrzędnych. W Xcode nad okienkiem wyjściowym debugowania znajduje się pasek z typową strzałką usług lokalizacji. Obok znajduje się rozwijana lista lokalizacji.Po uruchomieniu aplikacji zmień symulowaną lokalizację i sprawdź, czy ta zmiana wyzwoli Twój kod. Następnie przetestuj go na prawdziwym urządzeniu.

+0

To całkiem sprytne. Niestety to nie zadziałało, ale podoba mi się ten pomysł. Muszę tylko przetestować na prawdziwym urządzeniu. – Coltrane

0

W moim przypadku nie wszedł on na didChangeAuthorization. Próbowałem na prawdziwym urządzeniu.

Usunąłem aplikację z telefonu i zainstalowałem ją ponownie. I to działa!

Nadzieja to pomaga ktoś :)

0

Dla Swift 3

Metoda została zmieniona na:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

od:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [AnyObject]!)

Zwróć uwagę na "_" i obsadę "lokalizacji" na [CLLocation] zamiast [AnyObject]!

Jeśli używasz starej metody nigdy nie będą nazwie i nie otrzyma ostrzeżenie, że to się zmieniło.

Powiązane problemy