将 NSRect 保存到 NSUserDefaults
Posted
技术标签:
【中文标题】将 NSRect 保存到 NSUserDefaults【英文标题】:Saving NSRect to NSUserDefaults 【发布时间】:2011-10-11 13:36:03 【问题描述】:目前我正在尝试将 NSRect 保存到我的用户默认值。现在我正在使用 NSValue 将其包装为对象,然后使用以下代码将其作为对象保存到用户默认值中
[userDefaults setObject:[NSValue valueWithRect:rect forKey:@"Key"]];
但是,当我运行它时,我收到一条错误消息,显示 [NSUserDefaults setObject:forKey:]: Attempt to insert non-property value 'NSRect: 0, 0, 50, 50' of class 'NSConcreteValue'。
有谁知道我该如何解决这个问题?谢谢。
【问题讨论】:
您在示例中缺少]
。
缺少括号与此问题无关,您的答案在我正在链接的另一个 SO 线程上。恐怕您将不得不采取额外的步骤来保存您的 NSRect 对象 - ***.com/questions/471830/…。
感谢您的链接。我完全忘记了 NSUserDefaults 是如何只支持一定数量的对象的。
【参考方案1】:
这是一个更简单的解决方案,使用NSString
:
// store:
[[NSUserDefaults standardUserDefaults]
setValue:NSStringFromCGRect(frame) forKey:@"frame"];
// retrieve:
CGRect frame = CGRectFromString(
[[NSUserDefaults standardUserDefaults] stringForKey:@"frame"]);
斯威夫特 4
// store
UserDefaults.standard.set(NSStringFromCGRect(rect), forKey: "frame")
// retrieve
if let s = UserDefaults.standard.string(forKey: "frame")
let frame = CGRectFromString(s)
【讨论】:
+1 我喜欢简单,OP 只需要使用NSStringFromRect
和NSRectFromString
。【参考方案2】:
用户默认不支持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);
【讨论】:
以上是关于将 NSRect 保存到 NSUserDefaults的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Core Data(例如 NSRect)中存储非标准的持久属性?
Instruments:UI Automation:iPhone app - 如何使用 NSRect 的参数点击“null”按钮?