将NSRect保存到NSUserDefaults

The*_*mer 9 cocoa objective-c nsuserdefaults

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

[userDefaults setObject:[NSValue valueWithRect:rect forKey:@"Key"]];
Run Code Online (Sandbox Code Playgroud)

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

有谁知道我怎么解决这个问题?谢谢.

Mun*_*ndi 53

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

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

// retrieve:
CGRect frame = CGRectFromString(
   [[NSUserDefaults standardUserDefaults] stringForKey:@"frame"]);
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

// store
UserDefaults.standard.set(NSStringFromCGRect(rect), forKey: "frame")

// retrieve
if let s = UserDefaults.standard.string(forKey: "frame") {
   let frame = CGRectFromString(s)
}
Run Code Online (Sandbox Code Playgroud)

  • +1我喜欢简单,OP只需要使用`NSStringFromRect`和`NSRectFromString`. (4认同)

Joe*_*Joe 13

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);
Run Code Online (Sandbox Code Playgroud)