2012-11-21 9 views
10

Pracuję nad tym przez ostatnie 2 tygodnie - mam aplikację, która pokazuje czytelną trasę na mapie, która biegnie od punktu początkowego do punktu docelowego. punktem docelowym jest adres użytkownika (zdefiniowany/wprowadzony przez użytkownika w menu ustawień, które ustawiliśmy), a jeśli zakodowuję twardy punkt początkowy, mapa, trasa i aplikacja działają bez zarzutu. raz próbuję zaimplementować wszystko, co wymaga użycia cllocation lub cllocationmanager, to zawiesza się i daje mi błąd wątku (są 3).Aplikacja iPhone - jak uzyskać bieżącą lokalizację tylko raz i zapisać ją do użycia w innej funkcji?

Oto aktualny widok kontroler nagłówka & plik realizacja tego: file

#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 

realizacja:

#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 

bym po prostu chciał zapytać, czy ktoś może pomóc rzucić nieco światła na to, jak Mogę uzyskać informacje o aktualnych współrzędnych lokalizacji i zapisać je jako wartości start.latitude i start.longitude, aby trasa wskazywała drogę od aktualnej lokalizacji użytkownika do miejsca docelowego. trasa nie powinna się aktualizować w miarę przesuwania się użytkownika, chciałbym tylko mieć adnotację/oznaczenie miejsca na aktualnej lokalizacji i celu użytkownika (tak jak ja), a następnie niebieski punkt (znany również jako użytkownik) będzie mógł widzą się poruszać wzdłuż trasy, którą mają podążać. Wypróbowałem wszystkie sugestie tutaj - a niektóre nie działały, niektóre działały tylko raz, a potem nie działały ponownie (nawet po zresetowaniu zawartości symulatora!). niektóre linki są trafne, ale bardzo nieaktualne, więc metody tam nie działają.

I tutaj myślałem, że uzyskanie użytkownikom bieżących współrzędnych lokalizacji będzie łatwiejszym zadaniem tej funkcji!

Odpowiedz

16

plik .h

#import <CoreLocation/CoreLocation.h> 

@property (nonatomic,retain) CLLocationManager *locationManager; 

.m plik

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

Dziękuję! Skończyło się na użyciu NSUserDefaults do przechowywania lokalizacji z menedżera lokalizacji, ale zamiast klucza obiektu użyłem podwójnego klucza dla szerokości i długości geograficznej. Jeśli ktoś robi to - musisz pobrać lokalizację użytkownika na ekranie przed tym, który wyświetla trasę na mapie. w ten sposób funkcja ma wszystko, czego potrzebuje do działania viewdidload, w przeciwnym razie zawiesi się - tak właśnie miałem. Przepraszam, że nie mogę przegłosować, wciąż nowicjusz. – Fee

6

Prosty sposób na to jest, aby zapisać aktualną lokalizację wyjściową w NSUserDefaults

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

Następnie można uzyskać szerokość i długość geograficzną w następujący sposób:

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

Niestety im całkiem nowy, to - jak byłoby uzyskać szerokość i długość geograficzną być przechowywane jako przedmiot ?? – Fee

Powiązane problemy