【问题标题】:Saving NSRect to NSUserDefaults将 NSRect 保存到 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 对象 - stackoverflow.com/questions/471830/…
  • 感谢您的链接。我完全忘记了 NSUserDefaults 是如何只支持一定数量的对象的。

标签: objective-c cocoa 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);

【讨论】:

    猜你喜欢
    • 2012-06-13
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多