代码之家  ›  专栏  ›  技术社区  ›  codemonkey

无法识别的选择器问题

  •  0
  • codemonkey  · 技术社区  · 14 年前

    我很困惑…我有这个函数“colorwithhexstring”…当我将它包含在调用它的ViewController中时,它就会正常工作。但是当我将它移动到一个单独的“bsjax”类并用相同的输入参数调用它时,它会抛出一个无法识别的选择器错误。这是电话:

    BSjax *bsjax = [BSjax new];
    NSString *hexString = [NSString stringWithString:@"CCCCFF"];
    [self.view setBackgroundColor:[bsjax colorWithHexString:hexString]];
    

    我很确定我调用函数的方式会阻止它作为bsjax方法工作。如有任何反馈,将不胜感激。

    bsjax.h包括:

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

    …和bsjax.m包括:

    + (UIColor *)colorWithHexString:(NSString *)stringToConvert
    {
        NSString *cString = [[stringToConvert stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    
        // String should be 6 or 8 characters
        if ([cString length] < 6) NSLog(@"colorWithHexString called with parameter < 6 characters in length");
    
        // strip 0X if it appears
        if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];
    
        if ([cString length] != 6) NSLog(@"colorWithHexString called with parameter != 6 characters in length");
    
        // Separate into r, g, b substrings
        NSRange range;
        range.location = 0;
        range.length = 2;
        NSString *rString = [cString substringWithRange:range];
    
        range.location = 2;
        NSString *gString = [cString substringWithRange:range];
    
        range.location = 4;
        NSString *bString = [cString substringWithRange:range];
    
        // Scan values
        unsigned int r, g, b;
        [[NSScanner scannerWithString:rString] scanHexInt:&r];
        [[NSScanner scannerWithString:gString] scanHexInt:&g];
        [[NSScanner scannerWithString:bString] scanHexInt:&b];
    
        return [UIColor colorWithRed:((float) r / 255.0f)
                               green:((float) g / 255.0f)
                                blue:((float) b / 255.0f)
                               alpha:1.0f];
    }
    
    2 回复  |  直到 14 年前
        1
  •  6
  •   ohhorob    14 年前

    您正在尝试对实例调用类方法。

    注意到 + :

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

    这意味着您只能将方法调用为 [ClassName classmethod]

    然后在这里,您尝试将该方法与实例一起使用 [instanceObject classmethod] :

    BSjax *bsjax = [BSjax new];
    [self.view setBackgroundColor:[bsjax colorWithHexString:hexString]];
    

    尝试将其更改为:

    [self.view setBackgroundColor:[BSjax colorWithHexString:hexString]];
    

    这会让你变得正直。

        2
  •  2
  •   Chuck    14 年前

    是否在中声明了ColorWithHexString @interface BSjax 在头文件中,是否将该头文件导入到报告错误的源文件中?

    编辑:

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

    上面的代码(+)声明了一个类方法,这意味着应该用类名调用它。您使用未定义的类实例调用它。尝试:

    [self.view setBackgroundColor:[BSjax colorWithHexString:hexString]];