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