2

NSStrings でいっぱいの配列があり、NSString を使用して属性付きテキストの色を変更する必要があります。元の NSString を色付きの単一の NSString を含む配列に分離しましたが、ここで立ち往生しています。配列からの文字列は [UIColor orangecolor] です。これを試しましたが、null が返されます。

 SEL blackSel = NSSelectorFromString(@"blackColor");
 UIColor* tColor = nil;
if ([UIColor respondsToSelector: blackSel])
  tColor  = [UIColor performSelector:blackSel];
4

5 に答える 5

9

デフォルトの動作であるバイト配列を使用して保存されている色が気に入らなかったため、保存のためにNSValueTransformer変換(および変換)できるカスタムを作成しました。IB 内で custom-transformer を設定すると、KVO でも機能します。もちろん、コード内で静的メソッドを呼び出して変換を実行することもできます。NSColorNSStringNSUserDefaults

これを次のように作り直すのは、たいへんな作業ではないはずですUIColor:

StringColorTransformer.h:

#import <Cocoa/Cocoa.h>

@interface StringColourTransformer : NSValueTransformer

+ (NSString *)toString:(NSColor *)value;
+ (NSColor *)fromString:(NSString *)value;

@end

StringColorTransformer.m:

#import "StringColourTransformer.h"

@implementation StringColourTransformer

+ (NSString *)toString:(NSColor *)value
{
    StringColourTransformer *transformer = [[StringColourTransformer alloc] init];
    NSString *str = [transformer reverseTransformedValue:value];
    return str;
}

+ (NSColor *)fromString:(NSString *)value
{
    StringColourTransformer *transformer = [[StringColourTransformer alloc] init];
    NSColor *color = (NSColor *)[transformer transformedValue:value];
    return color;
}

+ (Class)transformedValueClass
{
    return [NSString class];
}

+ (BOOL)allowReverseTransformation
{
    return YES;
}

- (id)transformedValue:(id)value
{
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;

    // Only NSString classes are reverse-transformed
    if ([value isKindOfClass:[NSString class]])
    {
        NSString *stringValue = (NSString *)value;
        sscanf([stringValue UTF8String],
#ifdef __x86_64
               "%lf %lf %lf %lf",
#else
               "%f %f %f %f",
#endif
               &r, &g, &b, &a);
    }

    return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a];
}

- (id)reverseTransformedValue:(id)value
{
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;

    // Only NSColor classes are transformed
    if ([value isKindOfClass:[NSColor class]])
    {
        NSColor *colourValue = (NSColor *)value;
        NSColor *converted = [colourValue colorUsingColorSpaceName:@"NSCalibratedRGBColorSpace"];
        [converted getRed:&r green:&g blue:&b alpha:&a];
    }

    return [NSString stringWithFormat:@"%.3f %.3f %.3f %.3f", r, g, b, a];
}

@end
于 2013-06-15T08:40:29.127 に答える
4

colornameこのメソッドを使用して、オブジェクトに変換しますUIColor

-(UIColor *)giveColorfromStringColor:(NSString *)colorname
{
    SEL labelColor = NSSelectorFromString(colorname);
    UIColor *color = [UIColor performSelector:labelColor];
    return color;
}
于 2013-06-15T08:36:19.340 に答える
2

文字列にこの形式 @"1 0.96 0.75 1" を使用するだけで、値は赤、緑、青、およびアルファになります。次に、CIColor を使用してそれらを UIColor に変換します。

次に例を示します。

      NSString *spinnerColorStr = @"1 0.96 0.75 1";
      CIColor *spinnerCi = [CIColor colorWithString:spinnerColorStr];
      UIColor *spinnerColor = [UIColor colorWithRed:spinnerCi.red green:spinnerCi.green blue:spinnerCi.blue alpha:spinnerCi.alpha];
于 2014-02-06T14:06:26.720 に答える
1

@trojanfoe の優れた回答に基づいて、カテゴリベースのソリューションを作成しました。これは、Info.plist ファイルから UIViewControllers を動的に構成するために使用しています (多くのアプリが共通のコードベースを共有している場合に役立ちます)。

UIColor+String.h:

#import <UIKit/UIKit.h>

@interface UIColor (String)

+(UIColor*) colorFromString:(NSString*) string;

@end

UIColor+String.m:

#import "UIColor+String.h"

@implementation UIColor (String)

/**
 c.f. http://stackoverflow.com/a/17121747/153422
 */
+(UIColor *)colorFromString:(NSString *)stringValue
{
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;
    sscanf([stringValue UTF8String],
#ifdef __x86_64
           "%lf %lf %lf %lf",
#else
           "%f %f %f %f",
#endif
           &r, &g, &b, &a);

    return [UIColor colorWithRed:r green:g blue:b alpha:a];
}

@end

使用例:

NSString* colourString = [[NSBundle mainBundle].infoDictionary valueForKeyPath:@"Theme.Colours.NavigationBar.Title"];
    lTitle.textColor = [UIColor colorFromString:colourString];

(これは、Info.plist を編集し、サブディクト「Colours」、サブディクト「NavigationBar」、値が「1 0 0 1」(赤) の NSString「タイトル」を含むディクト「テーマ」を追加したことを前提としています)

于 2013-11-20T16:31:06.560 に答える
0

[以下の編集を探してください]

ルックアップテーブルを使用します。この場合、可能な値をキーとして保持し、値を UIColor オブジェクトとして保持する辞書。そのような :

NSDictionary *colorTable = @{
    @"blackColor" : [UIColor blackColor],
    @"greenColor" : [UIColor greenColor],
    @"redColor" : [UIColor redColor]
};

そのため、色の文字列を「変換」したい場合は、次のようにします。

UIColor *myConvertedColor = [colorTable objectWithKey:@"blackColor"];

myConvertedColor は UIColorBlack になります。

お役に立てれば!幸運を!


--->>編集<<----

OK、これがテスト済みのコードです。実行中の可能性のある他のものから干渉を受けないように、きれいな場所で試してください。iOS を想定していることに注意してください。それ以外の場合は、UIColor を NSColor に変更します。

  NSDictionary *colorTable = @{
                                 @"blackColor" : [UIColor blackColor],
                                 @"greenColor" : [UIColor greenColor],
                                 @"redColor" : [UIColor redColor]
                                 };


    UIColor *myConvertedColorNull = [colorTable objectForKey:@"whiteColor"]; //NULL
    UIColor *myConvertedColor = [colorTable objectForKey:@"blackColor"]; //NOT NULL

    NSLog(@"MyColor: %@", [myConvertedColor description]);
    NSLog(@"MyColorNULL: %@", [myConvertedColorNull description]);

これにより、次の出力が生成されます。

MyColor: UIDeviceWhiteColorSpace 0 1 MyColorNULL: (ヌル)

ご覧のとおり、MyColorNULL は検索を行うべきではないことを証明するためのものであり、もう一方は私のコードが機能することを証明するものです。

役に立ったら、私の答えに正しいタグを付けてください。そうでない場合は、それを解決し続けましょう。

于 2013-06-15T08:36:31.203 に答える