Как заменить существующие UIColors

Я пытаюсь создать систему тем для своего приложения. Есть ли способ переопределить UIColors по умолчанию? Я уже пытался создать подкласс UIColor:

//.h file

#import <UIKit/UIKit.h>

@interface UIColor(UIColor_themeColor)

+ (UIColor *)blackColor;

@end

//.m file

#import "UIColor+themeColor.h"
#import "DeviceColor.h"

@implementation UIColor(UIColor_themeColor)

+ (UIColor *)blackColor {
    return [self  blackColor];
}

@end

Но тогда я получаю предупреждение Category is implementing a method which will also be implemented by its primary class что понятно, и приложение будет зависать, если я его соберу.

Есть ли способ сделать то, что я люблю делать?

1 ответ

Решение

Думаю, преамбула, которую вы получите от всех: делать то, что вы хотите, - плохая идея как метод, называемый blackColor должен вернуть черный цвет. Методы всегда должны быть соответствующим образом названы.

После преамбулы:

Используйте метод Swizzling. Вы не можете сделать это напрямую через объявления, но поскольку среда выполнения Objective C является динамической, вы можете переключать реализации методов во время выполнения. Вам нужно напрямую поговорить со средой выполнения, с ее C API, но это не так сложно.

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

Другие вопросы по тегам