将 NSRect 保存到 NSUserDefaults

问题描述 投票:0回答:2

目前我正在尝试将

NSRect
保存到我的用户默认值。现在我使用
NSValue
将其包装为对象,然后使用以下代码将其作为对象保存到用户默认值中:

[userDefaults setObject:[NSValue valueWithRect:rect forKey:@"Key"]];

但是,当我运行它时,我收到一条错误消息:

[NSUserDefaults setObject:forKey:]:尝试插入类“NSConcreteValue”的非属性值“NSRect: {{0, 0}, {50, 50}}”。

有人知道我该如何解决这个问题吗?

objective-c cocoa nsuserdefaults
2个回答
56
投票

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

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

14
投票
用户默认不支持

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);
© www.soinside.com 2019 - 2024. All rights reserved.