2010-05-17 5 views
1

je le code suivant dans le contrôleur de vue:Impossible de définir la couleur d'arrière-plan UIView de ViewController

- (void)viewDidLoad { 
    [super viewDidLoad]; 
ThemeManager *themer = [ThemeManager sharedInstance]; 
UIView *theView = self.view; 
UIColor *forBackground = [themer backgroundColour]; 
[theView setBackgroundColor:forBackground]; 
} 

mais quand l'exécution arrive à la ligne de setBackgroundColor, je reçois l'erreur suivante:

*** -[NSCFNumber CGColor]: unrecognized selector sent to instance 0x1237c40 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFNumber CGColor]: unrecognized selector sent to instance 0x1237c40' 

Il doit y avoir quelque chose de simple que je fais mal, comment puis-je définir la couleur d'arrière-plan?

Dois-je sous-classe la vue et le faire là-dedans? Je préfère ne pas avoir la classe supplémentaire, même si cela est une meilleure séparation de l'ensemble du modèle/vue/contrôleur chose.

Mise à jour: la valeur retournée par [themer backgroundColour] est construite en utilisant colorWithPatternImage:, est-ce que cela peut faire une différence?

Mise à jour: si j'utilise une valeur dans mon ThemeManager qui a été construit en utilisant colorWithRed: vert: bleu: alpha :, que cela fonctionne correctement. Est-il possible de le faire en utilisant une couleur avec une image de fond? Les travaux suivants: OK

[theView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]]; 

Mise à jour: cela ne fonctionne bien aussi:

UIColor *forBackground = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 
[theView setBackgroundColor:forBackground]; 

Dans mon exemple original, l'objet retourné de [themer backgroundColor] était un UIColor, alors quel est le problème?

Lorsque je fais un pas dans le débogueur:

UIColor *forBackground = [themer backgroundColour]; 

résultats dans forBackground être de type NSConstantValueExpression *

et

UIColor *forBackground = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 

résultats dans forBackground être de type UIDeviceRGBColor *

ici est le code pour la méthode backgroundColour du ThemeManager:

- (UIColor *)backgroundColour { 
if (backgroundColour == nil) { 
    backgroundColour = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 
} 

return backgroundColour; 
} 

backgroundColour est aussi le nom d'une variable d'instance.

Répondre

2

Le problème était que je ne l'ai pas retain le UIColor dans le ThemeManager, donc cela a fonctionné sur la première vue, mais pas les suivantes.

Nouveau code dans ThemeManager:

backgroundColour = [[UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]] retain]; 
0

Il semble que cette ligne renvoie une instance non valide:

UIColor *forBackground = [themer backgroundColour]; 

L'erreur dit que forBackground est de classe NSCFNumber et non de classe classe UIColor comme prévu. S'il vous plaît vérifier que la méthode backgroundColour retourne le type correct.

Mise à jour:

Avez-vous vérifié la valeur de backgroundColour dans le débogueur pour cette méthode?

- (UIColor *)backgroundColour { 
    if (backgroundColour == nil) { 
     backgroundColour = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 
    } 
    return backgroundColour; 
} 

Je soupçonne que backgroundColour n'est pas réglé à NULL lorsque l'instance est créée.Le test échoue donc et la méthode renvoie une référence aléatoire.

+0

Le débogueur arrête avec la flèche rouge sur la ligne contenant setBackgroundColor – Curyous

+0

Vous construisez la couleur du motif que si backgroundColour est nul. Êtes-vous sûr que backgroundColour est nul? Si vous placez un point d'arrêt sur la ligne qui crée la couleur, le débogueur s'arrête-t-il? –

+0

Bon point, j'ai déplacé le code générateur de couleur à la méthode init, une meilleure solution de toute façon, même si ce n'était pas la cause première de ce problème. – Curyous

0

Je pourrais sembler comme si le thème renvoie un nombre au lieu d'une couleur, peut-être que le sujet traite des valeurs hexadécimales RVB?

Je construis parfois une classe customColor avec une classe Méthode + (UIColor *) getCustomColor: (CustomColorType) couleur; que j'utilise une fois que le thème de couleur de l'application est déterminé, il vous donne également l'avantage de pouvoir changer les couleurs d'un endroit et que le changement soit instantané partout. Je le fais généralement dans les valeurs 0xFFFFFFFF car c'est ainsi que la plupart des concepteurs traitent la couleur.

C'est "Copier-gaspillée" de mon dernier projet:

// 
// CustomColor.h 
// FC 
// 
// Created by RickiG on 12/19/09. 
// Copyright 2009 www.rickigregersen.com.. All rights reserved. 
// 

#import <Foundation/Foundation.h> 

typedef enum { 

    CustomColorWhiteText, 
    CustomColorDarkGreyText, 
    CustomColorLightGreyText, 
    CustomColorGreyText, 
    CustomColorLightBlueText, 
    CustomColorDarkWhiteText, 
    CustomColorLightWhiteText, 
    CustomColorLightPurpleText, 
    CustomColorOrange, 
    CustomColorRed, 
    CustomColorSilver, 

} CustomColorType; 

@interface CustomColor : NSObject { 

} 

+ (UIColor*) getCustomColor:(CustomColorType) color; 

@end 

Et la mise en œuvre:

// 
// CustomColor.m 
// FC 
// 
// Created by RickiG on 12/19/09. 
// Copyright 2009 www.rickigregersen.com.. All rights reserved. 
// 

#import "CustomColor.h" 


@implementation CustomColor 

+ (UIColor*) getCustomColor:(CustomColorType) color { 

    int value; 

    switch (color) { 

     case CustomColorWhiteText: 
      value = 0xffffff; 
      break;   
     case CustomColorDarkGreyText: 
      value = 0x373737; 
      break; 
     case CustomColorGreyText: 
      value = 0x7a7a7a; 
      break; 
     case CustomColorLightGreyText: 
      value = 0xd3d3d3; 
      break;   
     case CustomColorLightBlueText: 
      value = 0x8ed6ff; 
      break; 
     case CustomColorDarkWhiteText: 
      value = 0x979797; 
      break; 
     case CustomColorLightWhiteText: 
      value = 0xe8e8e8; 
      break; 
     case CustomColorLightPurpleText: 
      value = 0xd17efc; 
      break; 
     case CustomColorOrange: 
      value = 0xfb8720; 
      break; 
     case CustomColorRed: 
      value = 0xeb0008; 
      break; 
     case CustomColorSilver: 
      value = 0xe3e3e3; 
      break; 

     default: 
      value = 0x000000; 
      break; 
    } 

    int r, g, b; 
    b = value & 0x0000FF; 
    g = ((value & 0x00FF00) >> 8); 
    r = ((value & 0xFF0000) >> 16); 

    return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f]; 
} 

@end 

De cette façon, je peux toujours aller:

[UIView setBackgroundColor:[CustomColor getCustomColor:CustomColorWhiteText]; 

De partout dans mon projet. J'ai le même type de fichier pour gérer les étiquettes de texte, boutons et autres éléments d'interface qui sont réutilisés via une application.

Hope it helps si vous construisez une interface utilisateur qui devrait être en mesure de changer son apparence à la volée, même si ce n'était pas exactement ce que vous avez demandé :)

Questions connexes