web-dev-qa-db-fra.com

Objectif C définissant les constantes UIColor

J'ai une application iPhone avec quelques couleurs personnalisées pour mon thème. Étant donné que ces couleurs seront fixées pour mon interface utilisateur, je voudrais définir les couleurs dans une classe à inclure (Constants.h et Constants.m). Comment je fais ça? (Leur simple définition ne fonctionne pas car les UIColors sont mutables et peuvent provoquer des erreurs - Initalizer n'est pas constant).

/* Constants.h */
extern UIColor *test;

/* Constants.m */
UIColor *test = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];

Merci!

28
futureelite7

Un UIColor n'est pas modifiable. Je le fais généralement avec des couleurs, des polices et des images. Vous pouvez facilement le modifier pour utiliser des singletons ou avoir un initialiseur statique.

@interface UIColor (MyProject)

+(UIColor *) colorForSomePurpose;

@end

@implementation UIColor (MyProject)

+(UIColor *) colorForSomePurpose { return [UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]; }

@end
47
drawnonward

Pour plus de simplicité, je l'ai fait:

/* Constants.h */
#define myColor [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0]

N'oubliez pas de laisser de côté le ';' vous pouvez donc l'utiliser comme une expression normale.

Je ne suis pas sûr qu'il y ait quelque chose de techniquement incorrect avec cette approche, mais cela fonctionne bien et évite l'erreur d'initialisation de la constante de compilation - ce code est effectivement bloqué en place partout où vous mettez 'myColor', donc il ne sera jamais compilé jusqu'à ce que vous l'utilisiez réellement.

30
Fateh Khalsa

Une autre option

dans votre .h vous pouvez faire

extern UIColor *  const COLOR_LIGHT_BLUE;

dans votre .mm vous pouvez faire

UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255  blue:1 alpha:1];//;#15B4FF
14
yeahdixon

Si vous en cherchez un rapide et sale sans extensions, allez avec clang :

#define kGreenColor colorWithRed:(0/255.0) green:(213/255.0) blue:(90/255.0) alpha:1.0

- (void)doSomething
{
   _label.textColor = [UIColor kGreenColor];

}
3
AmitP

Souvent, les gens mettent des constantes globales dans des objets singleton - ou, comme indiqué plus loin, vous pouvez les rendre accessibles via une méthode de classe d'une classe.

Voici une autre façon:

Entête:

#if !defined(COLORS_EXTERN)
    #define COLORS_EXTERN extern
#endif

COLORS_EXTERN UIColor *aGlobalColor;

La mise en oeuvre:

#define COLORS_EXTERN
#import "GlobalColors.h"


@interface GlobalColors : NSObject
@end

@implementation GlobalColors

+ (void)load
{
    aGlobalColor = [UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1];
}

@end

C'est un peu un hack, mais vous n'avez pas besoin de redéfinir la couleur dans l'implémentation et vous pouvez accéder aux couleurs sans appel de méthode.

0
goetz