Цель C, определяющая константы UIColor - PullRequest
27 голосов
/ 13 мая 2010

У меня есть приложение для iPhone с несколькими пользовательскими цветами для моей темы. Поскольку эти цвета будут исправлены для моего пользовательского интерфейса, я хотел бы определить цвета в классе, который будет включен (Constants.h и Constants.m). Как я могу это сделать? (Простое их определение не работает, потому что UIColors изменчивы и могут вызвать ошибки - Initalizer не постоянен).

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

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

Спасибо! * * 1004

Ответы [ 7 ]

45 голосов
/ 13 мая 2010

UIColor не является изменяемым. Я обычно делаю это с цветами, шрифтами и изображениями. Вы можете легко изменить его, чтобы использовать синглтоны или иметь статический инициализатор.

@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
30 голосов
/ 01 мая 2013

Для простоты я сделал это:

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

Не забудьте пропустить ';' так что вы можете использовать его как нормальное выражение.

Я не уверен, что с этим подходом что-то не так с технической точки зрения, но он работает нормально и избегает ошибки инициализатора констант во время компиляции - этот код фактически застрял на месте, где бы вы ни поместили «myColor», поэтому никогда не скомпилируется, пока вы его не используете.

14 голосов
/ 06 января 2012

Другой вариант

в вашем .h вы можете сделать

extern UIColor *  const COLOR_LIGHT_BLUE;

в вашем .mm вы можете сделать

UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255  blue:1 alpha:1];//;#15B4FF
3 голосов
/ 25 октября 2014

Если вы ищете быстрый и грязный без расширений, используйте clang :

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

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

}
0 голосов
/ 04 декабря 2014

Вот еще один способ:

Заголовок:

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

COLORS_EXTERN UIColor *aGlobalColor;

Реализация:

#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

Это что-то вроде хака, но вам не нужно переопределять цвет в реализации, и вы можете получить доступ к цветам без вызова метода.

0 голосов
/ 13 мая 2010

Используйте AppController, чтобы сделать цвета доступными глобально, а не статическую переменную. Таким образом, это имеет смысл с точки зрения архитектуры, а также, если вы хотите гипотетически изменить цветовые схемы, даже во время работы, это будет просто один или два метода в AppController

0 голосов
/ 13 мая 2010

Часто люди помещают глобальные константы в одноэлементные объекты - или, как уже отмечалось ранее, вы можете сделать их доступными через метод класса некоторого класса.

...