将 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 只需要使用NSStringFromRectNSRectFromString【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章

NSRect vs CGRect:y轴反转

如何保存 UIPickerView 行选择

NSRect 位置和尺寸

如何在 Core Data(例如 NSRect)中存储非标准的持久属性?

Instruments:UI Automation:iPhone app - 如何使用 NSRect 的参数点击“null”按钮?

在 macOS 上使用 Swift 在 PDF 上绘图