2012-07-28 8 views
8
nicht

So jetzt habe ich zumindest bin immer Rückrufe mit dem folgenden Code ...CLLocationManager startUpdatingLocation Arbeits

- (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]; 


} 

ich können Haltepunkte in dem zweiten Verfahren eingestellt und NSLog kontinuierliche Standortaktualisierungen berichtet, aber aus irgendeinem Grund Der Zoom mit Span funktioniert nicht. Irgendeine Idee warum? Es hat meine Koordinaten und alles. Irgendwie kratzte ich mich an diesem Kopf.

+0

Ihr Code scheint ok .. Problem ist smwhere sonst – samfisher

+0

Haben Sie diese Probleme im Simulator? Haben Sie die Standortbestimmung simuliert? – HeikoG

+0

Ja, Simulator Probleme. Ich habe den Simulationsort aktiviert. Vielleicht muss ich es auf einem Gerät testen. – Coltrane

Antwort

15

Weisen Sie den CLLocationManager einer (starken) Eigenschaft für Ihre Klasse zu. (Ich nehme an, dass Sie ARC BTW verwenden.) Momentan lebt der CLLocationManager nicht über das Ende der viewDidLoad-Methode hinaus, so dass er auch nicht Ihre Delegate-Methode aufrufen kann.

+0

schien keinen Unterschied zu machen. Ich teste wieder am Simulator. Will Test eines Geräts Montag. – Coltrane

+0

Entschuldigung, mein Fehler. Sie sind genau richtig. Ich bekomme jetzt Rückrufe "habe den Standort aktualisiert". Mein Problem ist jetzt, dass der Zoom mit span nicht funktioniert. Irgendwelche weiteren Ideen dazu? – Coltrane

+0

+1, Arbeitete für mich. Das war das einzige Problem in meinem Fall. Prost. – viral

1

Nun, zunächst einmal können Sie nie sicher sein, dass der Standortmanager in der Lage ist, den Standort an erster Stelle zu aktualisieren. Während des Updates konnte ein Fehler auftreten oder Sie haben keinen Zugriff auf den Standort des Benutzers.

Implementieren Sie diese Delegierungsmethode CLLocationManager und überprüfen Sie den Fehler.

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

"Die Implementierung dieser Methode ist optional. Sie sollte diese Methode implementieren, aber."

+1

Keine Fehler gemeldet. Ich versuche diesen Test am iOS-Simulator. Könnte das etwas damit zu tun haben? – Coltrane

5

Ich denke, Sie diese Arbeit von zwei Möglichkeiten machen können:

  1. Mit CLLocation Rahmen

Überprüfen Sie, ob Sie die Viewcontroller mit CLLocationManagerDelegate Methoden eingeführt haben

#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 die gleiche MKMapKit Rahmen Sie können dies tun, indem Sie die MKMapViewDelegate Methode didUpdateUserLocation genannt: Hier haben Sie die CLLocaionManager nicht benötigen, Erzielt wird dies durch: In ViewController.h:

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

und in ViewController.m Datei:

@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

Mit Methode 1 erhalte ich Rückrufe, aber der Zoom (Bereich) zoomt nicht auf die Position. Ich habe meinen Code überarbeitet. Vielleicht einen Blick darauf werfen und sehen, ob etwas nicht stimmt? – Coltrane

13

Vergewissern Sie sich, dass Sie <CLLocationManagerDelegate> in derhinzugefügt habenDatei.

bearbeiten:

Wenn der Delegat richtig eingestellt ist, stellen Sie sicher, dass Sie Ihre locationManager Eigenschaft verwenden:

In der .h Datei:

@property (nonatomic, strong) CLLocationManager *locationManager; 

In viewDidLoad:

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

Das würde nur Warnungen beheben, nicht viel anderes. –

+0

habe ich sicherlich. – Coltrane

1

Wenn Sie dies nur im Simulator ausführen, müssen Sie möglicherweise aufgefordert werden, die Koordinaten zu ändern. In Xcode gibt es eine Leiste über dem Debug-Ausgabefenster mit dem typischen Pfeil für die Ortungsdienste. Daneben ist eine Dropdown-Liste mit Standorten.Sobald die App ausgeführt wird, wechseln Sie den zu simulierenden Speicherort und sehen Sie, ob diese Änderung Ihren Code auslöst. Dann testen Sie es auf einem echten Gerät.

+0

Das ist ziemlich schlau. Leider hat es nicht funktioniert, aber ich mag die Idee. Ich muss nur auf einem echten Gerät testen. – Coltrane

0

In meinem Fall, es trat nicht auf didChangeAuthorization. Ich habe ein echtes Gerät versucht.

Ich löschte die Anwendung vom Telefon und installieren Sie es erneut. Und es funktioniert!

hoffe, das hilft jemand :)

0

Für Swift 3

Die Methode hat sich geändert:

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

aus:

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

Beachten Sie das '_' und die Besetzung von 'Standorten' auf [CLLocation] und nicht auf [AnyObject]!

Wenn Sie die alte Methode verwenden, wird sie nie aufgerufen und Sie erhalten keine Warnung, dass sie sich geändert hat.