2

16進数のカラーコードからカスタムカラーを作成しようとしています。UIColor + Hexという別のクラスがあります。このクラスは、16進文字列を受け取り、それをカラーコードに変換して、UIColorを返します。

UIColor + Hex.h

#import <UIKit/UIKit.h>

@interface UIColor (Hex)

+ (UIColor *)colorWithHexString:(NSString *)hex;

@end

UIColor + Hex.m

#import "UIColor+Hex.h"

@implementation UIColor (Hex)
+ (UIColor *)colorWithHexString:(NSString *)hex
{
    if ([hex length]!=6 && [hex length]!=3)
    {
        return nil;
    }

    NSUInteger digits = [hex length]/3;
    CGFloat maxValue = (digits==1)?15.0:255.0;

    NSUInteger redHex = 0;
    NSUInteger greenHex = 0;
    NSUInteger blueHex = 0;

    sscanf([[hex substringWithRange:NSMakeRange(0, digits)] UTF8String], "%x", &redHex);
    sscanf([[hex substringWithRange:NSMakeRange(digits, digits)] UTF8String], "%x", &greenHex);
    sscanf([[hex substringWithRange:NSMakeRange(2*digits, digits)] UTF8String], "%x", &blueHex);

    CGFloat red = redHex/maxValue;
    CGFloat green = greenHex/maxValue;
    CGFloat blue = blueHex/maxValue;

    return [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
}

@end

次に、UIColor + Hex.hを他のクラスの1つにインポートし、次の方法で呼び出します。

[self setSelectedfillColor:[UIColor colorWithHexString:@"FF0000"].CGColor];

このコードをヒットするたびに、このエラーが発生します...

'NSInvalidArgumentException'、理由:'+ [UIColor colorWithHexString:]:認識されないセレクターがクラス0x873d60に送信されました'

考えられることはすべて試しましたが、それでもエラーが発生し続けます。なぜこれが起こるのか誰かが何か考えを持っていますか?

4

3 に答える 3

7

プロジェクトの[ビルド設定]で他のリンカーフラグに追加-ObjC -all_loadします。

-ObjCを使用すると、静的ライブラリでkvcやcategoriesなどのObjective-C固有のものを使用できます。

-all_loadは、-ObjCが正しく使用されていないgcc/llvmのバグを解決します。

https://developer.apple.com/library/mac/#qa/qa2006/qa1490.html

于 2012-11-29T14:49:04.337 に答える
3

UIColor+Hex.m[ビルドフェーズ]タブの[コンパイルソース]リストに必ず追加してください。

コンパイラーはビルド中に文句を言いませんが、実行時にセレクターで停止します。

多くの場合、XCodeの「CompileSources」に欠落しているクラスがあります。

于 2012-12-04T20:03:28.803 に答える
2

投稿時にカテゴリをテストしました。cgcolorプロパティメソッドを使用しても正常に機能します。これらの2行を分離し、問題がsetSelectedFillColorにないことを確認します。デバッグエラーが誤解を招く場合があります。

于 2012-11-29T15:58:46.427 に答える