将NSRect保存到NSUserDefaults

时间:2011-10-11 13:36:03

标签: objective-c cocoa nsuserdefaults

目前我正在尝试将NSRect保存到我的用户默认值。现在我正在使用NSValue将其包装为对象,然后将其作为对象保存到用户默认值中,并带有以下代码

[userDefaults setObject:[NSValue valueWithRect:rect forKey:@"Key"]];

然而,当我运行它时,我收到一个错误,上面写着[NSUserDefaults setObject:forKey:]:尝试插入类的非属性值'NSRect:{{0,0},{50,50}}' 'NSConcreteValue'。

有谁知道如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:51)

这是一个更简单的解决方案,使用NSString

// store:
[[NSUserDefaults standardUserDefaults] 
   setValue:NSStringFromCGRect(frame) forKey:@"frame"];

// retrieve:
CGRect frame = CGRectFromString(
   [[NSUserDefaults standardUserDefaults] stringForKey:@"frame"]);

Swift 4

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