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