将CLLocationCoordinate2D存储到NSUserDefaults

我是新的iphone开发,我想存储CLLocationCoordinate2D对象到NSUserDefaults 。 我在尝试

  [defaults setObject:location forKey:@"userLocation"]; 

但它给出了错误'发送CLLocationCoordinate2D参数的不兼容的typesID'

那么如何将CLLocationCoordinate2D存储到NSUserDefaults ? 谢谢。

pdrcabrod

说:“默认对象必须是一个属性列表,即NSDataNSStringNSNumberNSDateNSArray ,或NSDictionary的实例。

我用这个来存储,

  NSNumber *lat = [NSNumber numberWithDouble:location.latitude]; NSNumber *lon = [NSNumber numberWithDouble:location.longitude]; NSDictionary *userLocation=@{@"lat":lat,@"long":lon}; [[NSUserDefaults standardUserDefaults] setObject:userLocation forKey:@"userLocation"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

而且访问使用,

  NSDictionary *userLoc=[[NSUserDefaults standardUserDefaults] objectForKey:@"userLocation"]; NSLog(@"lat %@",[userLoc objectForKey:@"lat"]); NSLog(@"long %@",[userLoc objectForKey:@"long"]); 

这是我会做的:

 NSData *data = [NSData dataWithBytes:&coordinate length:sizeof(coordinate)]; [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"key"]; [[NSUserDefaults standardUserDefaults] synchronize]; 

那么你可以像这样检索它:

 NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"key"]; CLLocationCoordinate2D coordinate; [data getBytes:&coordinate length:sizeof(coordinate)]; 

NSUserDefaults类提供了访问常见types(如浮点数,双精度,整数,布尔值和URL)的便捷方法。 一个默认对象必须是一个属性列表,也就是一个实例(或集合的实例组合):NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。 如果要存储任何其他types的对象,则通常应将其存档以创buildNSData的实例

请参阅: NSUserDefaults

你可以像这样设置

 CLLocationCoordinate2D coordinate; // need to set your coordinate here [[defaults setObject:[NSString stringWithFormat:@"%g",coordinate.latitude] forKey:@"latitude"] ]; [[defaults setObject:[NSString stringWithFormat:@"%g",coordinate.longitude] forKey:@"longitude"] ]; 

我希望它有帮助。

正如其他人所说,首先将其转换成DictionaryData对象,然后像平常一样保存它。 在Swift中我强烈推荐使用扩展。 以下是我所做的:

 extension CLLocationCoordinate2D { private static let Lat = "lat" private static let Lon = "lon" typealias CLLocationDictionary = [String: CLLocationDegrees] var asDictionary: CLLocationDictionary { return [CLLocationCoordinate2D.Lat: self.latitude, CLLocationCoordinate2D.Lon: self.longitude] } init(dict: CLLocationDictionary) { self.init(latitude: dict[CLLocationCoordinate2D.Lat]!, longitude: dict[CLLocationCoordinate2D.Lon]!) } }