如何使用NSUserDefault与几个preferenses和textColor

时间:2012-08-15 18:59:58

标签: ios uitextfield nsuserdefaults textcolor

我有一个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一起使用?我会批评任何好的解决方案。

3 个答案:

答案 0 :(得分: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-comformant(为了能够直接将它保存到用户默认plist)。

答案 1 :(得分:0)

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

从颜色创建NSData
[NSKeyedArchiver archivedDataWithRootObject:yourColor]; 

并使用

取消归档
[NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:yourColorKey]]

答案 2 :(得分:0)

如H2C03所述,您需要将其设为有效的属性列表项。悬停时,某些颜色不在RGB颜色空间中。但是,您可以将NSData放在plist中,UIColor支持存档。

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];

然后在另一边......

UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];