2012-11-21 7 views
10

Ho lavorato a questo nelle ultime 2 settimane: ho un'app che mostra un percorso leggibile su una mappa che va da un punto iniziale a un punto di destinazione. il punto di destinazione è l'indirizzo dell'utente (come definito/inserito dall'utente nel menu delle impostazioni che abbiamo impostato) e se io codifico il punto di partenza, la mappa, il percorso e l'applicazione funzionano tutti correttamente. una volta che cerco di implementare qualsiasi cosa che implichi l'utilizzo di cllocation o cllocationmanager, si blocca e mi dà un errore di thread (ce ne sono 3).iphone app - come ottenere la posizione corrente solo una volta e memorizzarla per essere utilizzata in un'altra funzione?

Ecco il file corrente View Controller intestazione & implementazione per questo: il 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 

implementazione:

#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 

mi piacerebbe fondamentalmente come chiedere se qualcuno può aiutare a far luce su come Potrei fare in modo che le coordinate attuali della posizione degli utenti vengano memorizzate come valori start.latitude e start.longitude in modo che il percorso mostri un percorso dalla posizione corrente dell'utente alla loro destinazione. il percorso non dovrebbe aggiornarsi man mano che l'utente si muove, vorrei solo avere un'annotazione/segnaposto sulla posizione corrente dell'utente e sulla destinazione (come ho) e quindi il punto blu (noto anche come utente) sarà in grado di vedersi muoversi lungo il percorso che devono percorrere. Ho provato tutti i suggerimenti qui - e alcuni non hanno funzionato affatto, alcuni hanno funzionato solo una volta e poi non è riuscito a funzionare di nuovo (anche dopo aver reimpostato il contenuto del simulatore!). alcuni link sono rilevanti ma molto obsoleti, quindi i metodi non funzionano.

E qui stavo pensando di ottenere le coordinate di posizione correnti degli utenti sarebbe il compito più facile di questa funzione!

risposta

16

file h

#import <CoreLocation/CoreLocation.h> 

@property (nonatomic,retain) CLLocationManager *locationManager; 

di file .m

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

Grazie !! Ho finito per usare NSUserDefaults per memorizzare la posizione dal gestore di posizione, ma invece della chiave dell'oggetto ho usato la doppia chiave per la latitudine e la longitudine. Se qualcun altro lo sta facendo, devi catturare la posizione degli utenti sullo schermo prima di quella che mostra la rotta sulla mappa. in questo modo la funzione ha tutto ciò di cui ha bisogno per il viewdidload, altrimenti si blocca - che è quello che avevo. Mi dispiace non posso votare, ancora un principiante. – Fee

6

Il modo più semplice per farlo è quello di memorizzare la posizione corrente di avviamento in NSUserDefaults

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

Poi si può ottenere la latitudine e la longitudine nel seguente modo:

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

Mi dispiace abbastanza nuovo per questo - come potrei ottenere la latitudine e longitudine da memorizzare come oggetto ?? – Fee

Problemi correlati