Хранить CLLocationCoordinate2D в NSUserDefaults
Я новичок в разработке iphone, и хочу сохранить объект CLLocationCoordinate2D
на NSUserDefaults
.
Я пытаюсь
[defaults setObject:location forKey:@"userLocation"];
Но он дает ошибку 'Отправка CLLocationCoordinate2D в параметр несовместимого идентификатора типа
Итак, как хранить CLLocationCoordinate2D
в NSUserDefaults
?
Спасибо.
Ответы
Ответ 1
Как
pdrcabrod
Указанный "Объект по умолчанию должен быть списком свойств, то есть экземпляром NSData
, NSString
, NSNumber
, NSDate
, NSArray
или NSDictionary
".
Я использую это для хранения
NSNumber *lat = [NSNumber numberWithDouble:location.latitude];
NSNumber *lon = [NSNumber numberWithDouble:location.longitude];
NSDictionary *[email protected]{@"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"]);
Ответ 2
Это то, что я сделал бы:
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)];
Ответ 3
Класс NSUserDefaults предоставляет удобные методы для доступа к общим типам, таким как float, doubleles, integers, Booleans и URL. Объектом по умолчанию должен быть список свойств, то есть экземпляр (или для коллекций - комбинация экземпляров): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Если вы хотите сохранить какой-либо другой тип объекта, вы должны, как правило, архивировать его, чтобы создать экземпляр NSDatastrong >
Смотрите: NSUserDefaults
Ответ 4
Вы можете установить такой вариант.
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"] ];
Надеюсь, что это поможет.
Ответ 5
Как говорили другие, сначала преобразуйте его в объект Dictionary
или Data
, а затем сохраните его, как обычно. В 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]!)
}
}