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

标签 iphone ios mkmapview

所以我在 NSUserDefault 中按下按钮时保存用户位置。但是当我调用它时,我得到了 null。

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

节省按钮按下时间:

 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);  

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

最佳答案

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

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

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

关于iphone - 使用 NSUserDefaults 存储和调用用户坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9268816/

相关文章:

iphone - 在运行时浏览核心数据内容(通过 Xcode 模拟器)

iphone - 带 2 个按钮的警报

iphone - iPhone 的 Twitter 框架

ios - 奇怪的 UIView.animateWithDuration 编译错误如果在动画 block 中有一些代码

iphone - 将 uitableview 重新加载到底部单元格

iphone - 使用 StoreKit 的应用内购买问题

ios - 尝试更改 webview.bounds.origin.x/y 时出现左值错误

ios - MKMapView 每次加载它的 View 时都使用大量内存

ios - MKMapview 实时汽车跟踪

ios - map View 相机航向问题