xcode 4 /如何设置textColor基于prefs



我看了SO,但找不到适合我的答案,所以这里是:

我正在尝试根据用户偏好设置颜色,字体和大小元素。我对字体和字体大小没有问题,但我似乎无法使颜色工作。

这就是我正在做的:

  1. 我有一组常量,如:

    星号define kBlackColor @"[UIColor blackColor]"

  2. 在读取我的prefs文件时,我已经确定我想要黑色,并设置

txtColor定义为:

NSString *txtColor;
  1. 当我想使用txtColor时,我这样写:

    cell.textLabel。

这可以编译,但是给我一个"unrecognized selector sent"的消息。

当您存储txtColor时,您正在存储一个字符串(忘记它看起来像objective-c的事实,您将其存储为字符串,并且一旦存储为字符串编译器如何使用它?),并且没有办法将字符串强制转换为UIColor。怎么会有呢?

要将颜色存储到NSUserDefaults中,必须将它们序列化为NSData

借用上一个答案:

存储颜色:

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];

检索颜色:

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

我决定用不同的方式来解决这个问题,所以我应该回答我自己的问题——我希望它能帮助到别人。

我没有允许用户更改每个设置,而是创建了一系列样式(0-5),并存储在一个plist中。

每个样式都有一组变量(字体名称、大小、颜色等)。

设置文件使用如下所示的变量,在应用程序启动时读取:

AppDelegate *mainDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
styleKeyValue = [mainDelegate styleValueKey];   
styleKey = [styleKeyValue intValue];
switch (styleKey) {
        case 0:
            fontName = @"Arial"; 
            fontSize = 16;
            selectedTintColor = [UIColor blackColor];
            selectedFontColor = [UIColor blackColor];
            backgroundImage = @"background0.png";
            break;

        case 1:
            fontName = @"Times"; 
            fontSize = 14;
            selectedTintColor = [UIColor blueColor];
            selectedFontColor = [UIColor blackColor];
            backgroundImage = @"background1.png";
            break;
        case 5:
            ...

    }

selectedTintColor和selectedFontColor定义为:

UIColor *selectedTintColor;
UIColor *selectedFontColor;

fontName和backgroundImage被定义为nsstring。字体大小为本地整数。

当我想给单元格设置样式时,我只需要输入这个:

cell.textLabel.font = [UIFont fontWithName:fontName size:fontSize];
cell.textLabel.textColor = selectedFontColor;

(tintColor是用来为分段细胞设置样式的)

再一次,我希望这能帮助到别人。我花了一整夜才想出这个相当简单的解决办法。

最新更新