目前我正在尝试将NSRect保存到我的用户默认值。现在我正在使用NSValue将其包装为对象,然后将其作为对象保存到用户默认值中,并带有以下代码
[userDefaults setObject:[NSValue valueWithRect:rect forKey:@"Key"]];
然而,当我运行它时,我收到一个错误,上面写着[NSUserDefaults setObject:forKey:]:尝试插入类的非属性值'NSRect:{{0,0},{50,50}}' 'NSConcreteValue'。
有谁知道如何解决这个问题?感谢。
答案 0 :(得分:51)
这是一个更简单的解决方案,使用NSString
:
// store:
[[NSUserDefaults standardUserDefaults]
setValue:NSStringFromCGRect(frame) forKey:@"frame"];
// retrieve:
CGRect frame = CGRectFromString(
[[NSUserDefaults standardUserDefaults] stringForKey:@"frame"]);
// store
UserDefaults.standard.set(NSStringFromCGRect(rect), forKey: "frame")
// retrieve
if let s = UserDefaults.standard.string(forKey: "frame") {
let frame = CGRectFromString(s)
}
答案 1 :(得分:12)
NSValue
。
value参数只能是属性列表对象:NSData, NSString,NSNumber,NSDate,NSArray或NSDictionary。对于NSArray和 NSDictionary对象,其内容必须是属性列表对象。
您需要将值存档到数据中,然后在访问时将其取消归档。
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSRect rect = { 0, 0, 10, 20 };
NSValue *value = [NSValue valueWithRect:rect];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:value];
[userDefaults setObject:data forKey:@"key"];
[userDefaults synchronize];
data = [userDefaults objectForKey:@"key"];
NSValue *unarchived = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@", unarchived);