使用NSUserDefaults存储和调用用户坐标

时间:2012-02-13 22:11:10

标签: iphone ios mkmapview

所以我在NSUserDefault中按下按钮时保存用户位置。但是当我打电话给它时,我就会失效。

目标是获取用户位置(完成)然后保存它,以便在重新加载地图时,引脚显示用户曾经的位置。现在它清除并重置地图。

按下按钮保存:

 MKCoordinateRegion location1;
 location1.center.latitude =locationManager.location.coordinate.latitude;
 location1.center.longitude= locationManager.location.coordinate.longitude;
 location1.span.longitudeDelta=0.1;
 location1.span.latitudeDelta =0.1;

 MapAnnotation *ann1 =[[MapAnnotation alloc] init];
 ann1.title=@"You Parked Here";
 ann1.subtitle=@"";
 ann1.coordinate= location1.center;
 [mapView addAnnotation:ann1];

 NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
 [ud setDouble:location1.center.latitude forKey:@"savedCoordinate-latitude"];
 [ud setDouble:location1.center.longitude forKey:@"savedCoordinate-longitude"];
 [ud setBool:YES forKey:@"savedCoordinate-exists"];
 [ud synchronize]; 

回顾viewWillAppear:

 -(void)viewWillAppear:(BOOL)animated{

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
if ([ud boolForKey:@"savedCoordinate-exists"])
{
    CLLocationCoordinate2D savedCoordinate;
    savedCoordinate.latitude = [ud doubleForKey:@"savedCoordinate-latitude"];
    savedCoordinate.longitude = [ud doubleForKey:@"savedCoordinate-longitude"];
    //create annotation object using savedCoordinate and add to map view...
    NSLog(@"%@",savedCoordinate.latitude);

    MKCoordinateRegion location1;
    //location1.center.latitude =savedCoordinate.latitude;
    //location1.center.longitude= savedCoordinate.longitude;
    location1.span.longitudeDelta=0.1;
    location1.span.latitudeDelta =0.1;

    MapAnnotation *ann1 =[[MapAnnotation alloc] init];
    ann1.title=@"You Parked Here";
    ann1.subtitle=@"";
    ann1.coordinate= savedCoordinate;
    [mapView addAnnotation:ann1];
 }  

}

完整.m页面:

 #import "LocationTestViewController.h"
 #import "CoreLocation/CoreLocation.h"
 #import "MapAnnotation.h"

 @implementation LocationTestViewController
 @synthesize locationManager;
 @synthesize mapView;
 @synthesize labelText;

 - (void)dealloc
 {
  [mapView release];
  [locationManager release];
  [super dealloc];
 }

 - (void)didReceiveMemoryWarning
{
  // Releases the view if it doesn't have a superview.
  [super didReceiveMemoryWarning];

  // Release any cached data, images, etc that aren't in use.
 }

 #pragma mark - View lifecycle

 /*
 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
 - (void)viewDidLoad
 {
    [super viewDidLoad];

 }*/
 -(void)viewWillAppear:(BOOL)animated{

   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
   if ([ud boolForKey:@"savedCoordinate-exists"])
    {
      CLLocationCoordinate2D savedCoordinate;
      savedCoordinate.latitude = [ud doubleForKey:@"savedCoordinate-latitude"];
      savedCoordinate.longitude = [ud doubleForKey:@"savedCoordinate-longitude"];
      //create annotation object using savedCoordinate and add to map view...
      NSLog(@"%f",savedCoordinate.latitude);

      MKCoordinateRegion location1;
      //location1.center.latitude =savedCoordinate.latitude;
      //location1.center.longitude= savedCoordinate.longitude;
      location1.span.longitudeDelta=0.1;
      location1.span.latitudeDelta =0.1;

      MapAnnotation *ann1 =[[MapAnnotation alloc] init];
      ann1.title=@"You Parked Here";
      ann1.subtitle=@"";
      ann1.coordinate= savedCoordinate;
      [mapView addAnnotation:ann1];
   }  

 }

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

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
  }

 - (IBAction)getLocation:(id)sender {

    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter=kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    [locationManager startUpdatingLocation];

    [mapView setMapType:MKMapTypeStandard];
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    MKCoordinateRegion region = {{0.0,0.0},{0.0,0.0}};
    region.center.latitude = locationManager.location.coordinate.latitude;
    region.center.longitude = locationManager.location.coordinate.longitude;
    region.span.longitudeDelta = 0.005f;
    region.span.latitudeDelta = 0.005f;
    [mapView setRegion:region animated:YES];
    [mapView setDelegate:sender];



    MKCoordinateRegion location1;
   location1.center.latitude =locationManager.location.coordinate.latitude;
   location1.center.longitude= locationManager.location.coordinate.longitude;
   location1.span.longitudeDelta=0.1;
   location1.span.latitudeDelta =0.1;

   labelText.text = [NSString stringWithFormat:@"LATITUDE: %f", location1.center.latitude];

   NSLog(@"button b4 save: %@", [NSString stringWithFormat:@"LATITUDE: %f", locationManager.location.coordinate.latitude]);

   MapAnnotation *ann1 =[[MapAnnotation alloc] init];
   ann1.title=@"You Parked Here";
   ann1.subtitle=@"";
   ann1.coordinate= location1.center;
   [mapView addAnnotation:ann1];

   NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
   [ud setDouble:location1.center.latitude forKey:@"savedCoordinate-latitude"];
   [ud setDouble:location1.center.longitude forKey:@"savedCoordinate-longitude"];
   [ud setBool:YES forKey:@"savedCoordinate-exists"];
   [ud synchronize]; 

   CLLocationCoordinate2D savedCoordinate;
   savedCoordinate.latitude = [ud doubleForKey:@"savedCoordinate-latitude"];
   savedCoordinate.longitude = [ud doubleForKey:@"savedCoordinate-longitude"];
   //create annotation object using savedCoordinate and add to map view...
   NSLog(@"button push, %f",savedCoordinate.latitude);
 }

 - (IBAction)clearPins:(id)sender{
    NSArray *annotations = [mapView annotations];
    for (id annotation in annotations)
 {
       if ([annotation isKindOfClass:[MKUserLocation class]])
       {
          continue;
       }
       [mapView removeAnnotation:annotation];
    }   

 } 

 -(IBAction)goMainMenu{
    [self.parentViewController dismissModalViewControllerAnimated:YES];
 }
 @end

编辑解决方案:

我将此添加到我的按钮方法:

 CLLocation *userLoc = mapView.userLocation.location;
 CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

 NSLog(@"user latitude = %f",userCoordinate.latitude);
 NSLog(@"user longitude = %f",userCoordinate.longitude);

 NSUserDefaults *gLat = [NSUserDefaults standardUserDefaults];
 [gLat setFloat:userCoordinate.latitude forKey:@"latNumber"];

 NSUserDefaults *gLong = [NSUserDefaults standardUserDefaults];
 [gLong setFloat:userCoordinate.longitude forKey:@"longNumber"];


 float myLat=[gLat floatForKey:@"latNumber"];
 NSLog(@"Button Push: lat : %f",myLat);

 float myLong=[gLong floatForKey:@"longNumber"];
 NSLog(@"Button Push: long : %f",myLong);  

可能不是最干净的事情,但它可以完成工作。

1 个答案:

答案 0 :(得分:2)

%@字符串格式说明符用于Objective-C对象,不能与浮点数一起使用。尝试使用%f运算符,如下所示:

NSLog(@"latitude is %f", savedCoordinate.latitude);

这是Apple关于String Format Specifiers的文档。