0

我有一个 UISwitch,除其他外,女巫禁用了 UITextfield。使用 NSUserDefaults 时,我管理开关以记住其当前状态(开/关)

NSString *const MyPrefKey =@"MyPrefKey";


 [[NSUserDefaults standardUserDefaults]
     setBool:[sender isOn]
     forKey:MyPrefKey];

开关状态在 viewDidLoad 中被调用

 BOOL switchState =[[NSUserDefaults standardUserDefaults]boolForKey:MyPrefKey];
 [mySwitch setOn:switchState];

这很完美,记住了 UISwitch 的位置。

用于在开关更改时启用文本字段

我按照建议尝试了:

 [[NSUserDefaults standardUserDefaults]
     setObject:[NSNumber numberWithBool:[myTextField isEnabled]]
     forKey:MyPrefKey];

并回忆起

BOOL mtf  =[[NSUserDefaults standardUserDefaults]boolForKey:MyPrefKey];
[myTextField setEnabled:mtf];

这也很好用。但是,当时只有其中一项有效。如何同时设置更多默认值?我必须制作几个 PrefKeys 吗?或者它们都可以存储在同一个prefKey中吗?

最后我尝试使用 NSUserDefaults 更改 textcolor

[[NSUserDefaults standardUserDefaults]
     setObject: [myTextField textColor]
     forKey: MyPrefKey];

召回时会导致崩溃

UIColor*newColor= [[NSUserDefaults standardUserDefaults] objectForKey: EfloraSharePrefKey];
[myTextField setTextColor:newColor];

那么如何将 NSUserDefault 与 textColor 一起使用?我会应用任何好的解决方案。

4

3 回答 3

1

您只能将属性列表对象保存到 NSUserDefaults。你必须以某种方式序列化你的颜色。一个可能的解决方案:

CGFloat r, g, b, a;
[myTextField.textColor getRed:&r green:&g blue:&b alpha:&a];
NSNumber *rn, *gn, *bn, *an;
rn = [NSNumber numberWithFloat:r];
gn = [NSNumber numberWithFloat:g];
bn = [NSNumber numberWithFloat:b];
an = [NSNumber numberWithFloat:a];
NSDictionary *color = [NSDictionary dictionaryWithObjectsAndKeys:
    rn, @"red",
    gn, @"green",
    bn, @"blue",
    an, @"alpha",
    nil];
[[NSUserDefaults standardUserDefaults] setObject:color forKey:@"TextColor"];

并检索它:

NSDictionary *color = [[NSUserDefaults standardUserDefaults] objectForKey:@"TextColor"];
NSNumber *rn, *gn, *bn, *an;
rn = [color objectForKey:@"red"];
...
UIColor *c = [UIColor colorWithRed:[rn floatValue]
    green:[gn floatValue]
    blue:[bn floatValue]
    alpha:[an floatValue]];
textField.textColor = c;

如果你想变得非常优雅,你可以将它包装到一个类别中,甚至使 UIColor 符合 NSCoding 标准(以便能够直接将其持久化到用户默认 plist 中)。

于 2012-08-15T19:07:48.393 回答
0

就像 H2C03 说的,你需要让它成为一个有效的属性列表项。悬停,有些颜色不在 RGB 颜色空间中。但是,您可以将 NSData 放在 plist 中,并且 UIColor 支持归档。

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];

然后在另一边...

UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
于 2012-08-15T19:17:35.227 回答
0

您可以使用 NSKeyedUnarchiver 归档/取消归档 UIColor 的数据。将 NSData 保存为 NSUserDetaults 的对象。使用从颜色创建 NSData

[NSKeyedArchiver archivedDataWithRootObject:yourColor]; 

并使用

[NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:yourColorKey]]
于 2012-08-15T19:14:51.243 回答