2012-11-21 7 views
10

Ich habe in den letzten 2 Wochen daran gearbeitet - ich habe eine App, die eine lesbare Route auf einer Karte zeigt, die von einem Startpunkt zu einem Zielpunkt führt. Der Zielpunkt ist die Benutzeradresse (wie vom Benutzer im Einstellungsmenü definiert/eingegeben) und wenn ich den Startpunkt fest programmiere, funktionieren Karte, Route und Anwendung einwandfrei. Sobald ich versuche, etwas zu implementieren, das die Verwendung von cllocation oder cllocationmanager beinhaltet, stürzt es ab und gibt mir einen Threadfehler (es gibt 3).iPhone App - Wie bekomme ich den aktuellen Standort nur einmal und speichere das in einer anderen Funktion?

Dies ist die aktuelle View-Controller-Header & Implementierungsdatei für diese:

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import "MapView.h" 
#import "Place.h" 
#import <CoreLocation/CoreLocation.h> 


@interface HomeMapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>{ 

    IBOutlet UILabel *HomeAddressLabel; 

} 

@property (weak, nonatomic) IBOutlet MKMapView *MapView; 
@property (strong, nonatomic) IBOutlet CLLocationManager *location; 
@end 

Implementierungsdatei:

#import "HomeMapViewController.h" 



@interface HomeMapViewController() 

@end 


@implementation HomeMapViewController 
@synthesize MapView; 
@synthesize location; 
double lat = 37.331706; 
double lon = -122.030598; 
- (id)initWithNibNameNSString *)nibNameOrNil bundleNSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 


- (void)viewDidLoad 
{ 
    //Retrieve saved address before view loads 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *HomeAddress = [defaults objectForKey:@"HomeAddress"]; 
    NSString *HomeCity = [defaults objectForKey:@"HomeCity"]; 
    NSString *HomeProvince = [defaults objectForKey:@"HomeProvince"]; 
    NSString *HomeZip = [defaults objectForKey:@"HomeZip"]; 
    NSString *HomeCountry = [defaults objectForKey:@"HomeCountry"]; 
    NSString *HomeAddressFull = [NSString stringWithFormat:@"%@, %@, %@, %@, %@", HomeAddress, HomeCity, HomeProvince, HomeZip, HomeCountry]; 

    //Set address label to saved address values 
    HomeAddressLabel.text = HomeAddressFull; 



    //Map Route Code 

     MapView* mapView = [[MapView alloc] initWithFrame: 
         CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
     //Shows user location 

    [self.MapView setShowsUserLocation:YES]; 
    //set which mapview to show 
     [self.MapView addSubview:mapView]; 

    self.location = [[CLLocationManager alloc]init]; 
    location.delegate = self; 
    location.desiredAccuracy=kCLLocationAccuracyBest; 
    location.distanceFilter = kCLLocationAccuracyBestForNavigation;//constant update of device location 
    [location startUpdatingLocation]; 


    Place* start = [[Place alloc] init]; 
    start.name = @"Start Location"; 
    start.description = @"You started here."; 
    //^should be changed to current location once that is implemented 
    //start.latitude = 37.331706; 
    //start.longitude = -122.030598; 
    start.latitude = lat; 
    start.longitude = lon; 
    //start.latitude = location.location.coordinate.latitude; 
    //start.longitude = location.location.coordinate.longitude; 


    //Geocoder Code 
    CLGeocoder *geocoder = [[CLGeocoder alloc] init]; 
    [geocoder geocodeAddressString:HomeAddressFull completionHandler:^(NSArray *placemarks, NSError *error) { 
     if (error) { 
      NSLog(@"Error: %@", [error localizedDescription]); 
      return; 
     } 

     for (id object in placemarks) { 
      CLPlacemark *placemark = object; 



      Place* destination = [[Place alloc] init]; 
      destination.name = @"Destination"; 
      destination.description = [NSString stringWithFormat:@"%@, %@, %@", HomeAddress, HomeCity, HomeProvince]; 
      destination.latitude = placemark.location.coordinate.latitude; 
      destination.longitude = placemark.location.coordinate.longitude; 

      [mapView showRouteFrom:start toestination]; 
     } 
    }]; 


    [super viewDidLoad]; 

} 

- (void)locationManagerCLLocationManager *)manager didUpdateToLocationCLLocation *)newLocation fromLocationCLLocation *)oldLocation{ 
    [manager stopUpdatingLocation]; 

} 



//************NEW METHOD 
-(void)locationManagerCLLocationManager *)manager didFailWithErrorNSError *)error{ 
    NSString *msg = @"Error obtraining location:"; 
    UIAlertView *alert; 
    alert = [[UIAlertView alloc] 
      initWithTitle:@"Error" 
      message:msg delegate:self 
      cancelButtonTitle:@"OK" 
      otherButtonTitles: nil]; 
    [alert show]; 

} 

- (void)viewDidUnload 
{ 
    [self setMapView:nil]; 
    HomeAddressLabel = nil; 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientationUIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 


@end 

ich im Grunde fragen möchte, ob jemand etwas Licht helfen kann, wie Ich könnte die aktuellen Standortkoordinaten der Benutzer abrufen und sie als Werte für Start.Latitude und Start.Longitude speichern, sodass die Route einen Pfad vom aktuellen Standort des Benutzers zum Ziel anzeigt. Die Route soll sich nicht selbst aktualisieren, wenn sich der Benutzer bewegt. Ich möchte nur eine Anmerkung/Ortsmarke über den aktuellen Standort und das Ziel des Benutzers (so wie ich) haben und dann kann der blaue Punkt (alias der Benutzer) dazu in der Lage sein sehen Sie sich entlang der Route, die sie nehmen sollen. Ich habe alle Vorschläge hier ausprobiert - und einige haben überhaupt nicht funktioniert, einige haben nur einmal funktioniert und danach hat es nicht mehr funktioniert (selbst nach dem Zurücksetzen des Simulatorinhaltes!). Einige Links sind relevant, aber sehr veraltet, so dass die Methoden dort nicht funktionieren.

Und hier dachte ich, die aktuellen Koordinaten des Benutzers zu bekommen wäre die leichtere Aufgabe dieser Funktion!

Antwort

16

.h-Datei

#import <CoreLocation/CoreLocation.h> 

@property (nonatomic,retain) CLLocationManager *locationManager; 

.m-Datei

- (NSString *)deviceLocation 
{ 
    NSString *theLocation = [NSString stringWithFormat:@"latitude: %f longitude: %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude]; 
    return theLocation; 
} 

- (void)viewDidLoad 
{ 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.distanceFilter = kCLDistanceFilterNone; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m 
    [self.locationManager startUpdatingLocation]; 
} 
+1

Danke !! Am Ende habe ich die NSUserDefaults verwendet, um den Standort vom Standortmanager zu speichern, aber anstelle des Objektschlüssels habe ich den doppelten Schlüssel für den Längen- und Breitengrad verwendet. Wenn dies jemand anderes tut, müssen Sie den Standort des Benutzers auf dem Bildschirm auswählen, bevor Sie die Route in der Karte anzeigen. Auf diese Weise hat die Funktion alles, was sie für das Viewdidload benötigt, sonst stürzt sie ab - was ich hatte. Entschuldigung, ich kann nicht upvote, immer noch ein Neuling. – Fee

6

Die einfache Art und Weise zu tun, ist der Start aktuellen Standort in NSUserDefaults speichern

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:latitude forKey:@"starLatitude"]; 
    [defaults setObject:longitude forKey:@"starLongitude"]; 
[defaults synchronize]; 

Dann können Sie die Breite und Länge in folgenden Weise erhalten:

NSString *lati = [defaults objectForKey:@"starLatitude"]; 
+1

sorry im ziemlich neu in diesen - wie würde ich die Breiten- und Längen bekommt als Objekt gespeichert werden ?? – Fee

Verwandte Themen