2010-06-05 5 views
0

Je suis perplexe ... J'ai cette fonction "colorWithHexString" ... quand je l'inclue dans le viewcontroller qui l'appelle alors ça marche très bien. Mais quand je le déplace vers une classe "BSJax" séparée et que je l'appelle avec le même paramètre d'entrée, il lance une erreur de sélecteur non reconnue. Voici l'appel:Malheurs de sélecteur non reconnus

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

Je suis sûr qu'il ya quelque chose sur la façon dont j'appelle la fonction qui l'empêche de travailler comme méthode bsjax. Tout commentaire sera apprécié.

BSjax.h comprend:

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

... et BSjax.m comprend:

+ (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

poster votre définition de méthode pour colorWithHexString et s'il vous plaît poster où il est défini (quel fichier) – coneybeare

+0

@coneybeare ... k, déclaration et définition ajoutée ... ce qui est curieux, c'est que lorsque je déplace la fonction vers le viewcontroller lui-même (sans changer quelque chose ... eh bien, je le change pour être une méthode privée au lieu de public ... ça fonctionne comme un charme) – codemonkey

+0

Je suis très mal à comprendre les pointeurs et la gestion de la mémoire et je me demande si je suis censé conserver mon La variable hexString ou quelque chose? – codemonkey

Répondre

6

Vous essayez d'appeler une méthode de classe sur une instance.

Notez le +:

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

Cela signifie que vous ne pouvez appeler la méthode que [ClassName classmethod]

Et puis là, vous essayez d'utiliser la méthode avec une instance [instanceObject classmethod]:

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

Essayez de le changer pour:

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

Et cela devrait vous mettre droit.

+0

HA! Agréable. Je suis tellement incompétent dans cette langue ... Je n'ai vraiment pas d'intérêt à tenter ce projet. Je pensais que le +/- représentait public/privé. Votre suggestion a fonctionné comme un charme ...^1 et marqué comme réponse. Je vous remercie! – codemonkey

2

est-colorWithHexString déclaré dans @interface BSjax dans un en-tête, et vous a fait #import cet en-tête dans la fichier source où l'erreur est signalée?

Edit:

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

Le code ci-dessus (+) déclare une méthode de classe, ce qui signifie qu'il devrait être appelé avec le nom de classe. Vous l'appelez avec une instance de la classe, pour laquelle elle n'est pas définie. Essayez:

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

oui dans les deux cas – codemonkey