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