2

我正在尝试使用十六进制颜色代码创建自定义颜色。我有一个名为 UIColor+Hex 的单独类,它接受一个十六进制字符串并将其转换为颜色代码并返回 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 导入我的其他类之一,并通过以下方式调用它:

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

每当我点击此代码时,我都会收到此错误...

'NSInvalidArgumentException',原因:'+[UIColor colorWithHexString:]:无法识别的选择器发送到类 0x873d60'

我已经尝试了我能想到的一切,但我仍然不断收到这个错误。任何人都知道为什么会发生这种情况?

4

3 回答 3

7

在 Build Settings 下的项目中添加-ObjC -all_load到您的 Other Linker Flags。

-ObjC 允许静态库使用 Objective-C 特定的东西,如 kvc 或categories

-all_load 解决 gcc/llvm 中的错误,其中 -ObjC 未正确使用。

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

于 2012-11-29T14:49:04.337 回答
3

确保添加UIColor+Hex.m到 Build Phases 选项卡中的 Compile Sources 列表。

编译器在构建期间不会抱怨,但会在运行时在选择器上死掉。

很多时候,它是 XCode 中“编译源”中缺少的类。

于 2012-12-04T20:03:28.803 回答
2

在您发布时测试了您的类别,即使使用 cgcolor 属性方法也可以正常工作。将这两行分开并确保问题不在于 setSelectedFillColor。有时调试错误可能会产生误导。

于 2012-11-29T15:58:46.427 回答