Подтвердить что ты не робот

Задача C, определяющая константы UIColor

У меня есть приложение 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];

Спасибо!

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

в вашем .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

Ответ 4

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

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

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

}

Ответ 5

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

Ответ 6

Здесь другой способ:

Заголовок:

#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

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

Ответ 7

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