2012-12-09 2 views
0

Je suis nouveau sur iPhone dev, et très rouillé avec la programmation de style C, à savoir les pointeurs. J'ai créé une classe RGBColor qui contient trois nombres de rouge, vert et bleu. Dans cette classe, j'ai une méthode statique pour retourner un UIColor pour trois valeurs int RVB. J'utilise cette méthode pour changer la couleur de fond de trois curseurs.Méthode ne fonctionne pas bien

Voici la méthode statique:

+(UIColor *)getColorFromRed:(int)redValue green:(int)greenValue blue:(int)blueValue 
{ 
    UIColor *color = [[UIColor alloc]initWithRed:redValue/256 
              green:greenValue/256 
              blue:blueValue/256 
              alpha:1.0]; 
    return color; 
} 

J'ai d'abord codé la méthode comme cela, mais il a changé quand il ne fonctionne pas:

+(UIColor *)getColorFromRGB:(int)redValue :(int)greenValue :(int)blueValue 
{ 
    UIColor *color = [[UIColor alloc]initWithRed:redValue/256 
              green:greenValue/256 
              blue:blueValue/256 
              alpha:1.0]; 
    return color; 
} 

Sur la base de ma compréhension, que ce soit la première ou la seconde est une manière valide d'écrire une méthode.

Maintenant, j'utiliser cette méthode pour changer la couleur de fond à mon avis avec ma fonction changeBackgroundColor, mais il ne fonctionne pas:

- (void)changeBackgroundColor 
{ 
    UIColor *color = [RGBColor getColorFromRed:redSlider.value 
             green:greenSlider.value 
              blue:blueSlider.value]; 

    [background setBackgroundColor:color]; 
} 

Si je complètement court-circuiter ma méthode statique, et juste le changeBackgroundColor méthode créer l'UIColor, les changements de couleur d'arrière-plan.

- (void)changeBackgroundColor 
{ 
    UIColor *color = [[UIColor alloc]initWithRed:redSlider.value/256 
              green:greenSlider.value/256 
              blue:blueSlider.value/256 
              alpha:1.0]; 

    [background setBackgroundColor:color]; 
} 

Le problème est trivial à résoudre: n'utilisez simplement pas la méthode statique. Je ne comprends pas pourquoi ça ne marche pas. Y at-il une sorte de transfert de pointeur vs d'objet, je suis en train de jouer avec la valeur de retour?

Répondre

1

Votre problème est que la valeur du curseur est de type float et quand vous passez à votre méthode statique, ils sont convertis en être de type int (puisque le type d'arguments est int) ce qui signifie que lorsque vous diviser par 256 le résultat est tronqué à zéro parce que vous divisez int avec et int (je suppose que vos valeurs de curseur sont toujours < 256 de sorte que la partie entière sera toujours zéro).

il suffit de changer vos types d'arguments de méthode statique pour float

+0

Ce fut le problème. Merci! – Ray

+0

lorsque vous divisez et int avec et int seule la partie entière du résultat est renvoyée. (donc toute division de x/y où x giorashc

1

int/int donner entier .... type de cas ou l'autre flotter de sorte que la valeur de 0,0 à 1,0 viendrait, sinon 255/256 vous donnera 0, acutally il serait 0.9 quelque chose et comme target est int, seule la partie entière sera considérée, résultant en 0.

+(UIColor *)getColorFromRGB:(float)redValue :(float)greenValue :(float)blueValue 
{ 
    UIColor *color = [[UIColor alloc]initWithRed:redValue/256.0 
              green:greenValue/256.0 
              blue:blueValue/256.0 
              alpha:1.0]; 
    return color; 
} 
+0

Je ne peux pas croire que c'était un problème de calcul simple. Je suis embarrassé. Merci! – Ray

+0

Je ai pointé l'erreur en premier, toujours pas d'acceptation :( –

+0

Désolé, il a dit que l'autre a été posté en premier.Je voudrais upvote mais je ne peux pas encore.Merci si! – Ray

Questions connexes