使用单例来创建基本样式助手类

nat*_*203 2 singleton objective-c uicolor ios

我是objective-c的新手,我有一个建筑或设计模式问题.我正在构建一个ios应用程序,像大多数ios应用程序一样,它使用各种颜色,字体,模式等.也许我目前正在编写错误的代码,但我发现自己重写了颜色设置等内容.结果,改变颜色成为查找代码中的所有颜色设置,重写它们等的练习.对我来说似乎有点低效.

例如,我在我的应用程序中的多个位置使用深红色.我倾向于频繁地编写[UIColor colorWithRed ...]方法.但是,我很好奇是否创建一个返回我的自定义颜色的单例(作为UIColor)是"模块化我的样式包"的合理方法.因此,我可以写这样的东西

[label setTextColor:[[MyStyleSingletonClass sharedStyler] myDarkRed]];
Run Code Online (Sandbox Code Playgroud)

因此,如果设计师突然希望myDarkRed变得更暗,我会改变它一次并且很好地浏览应用程序.显然,风格和用户体验比色彩还要多,但我很好奇这种方法是否有意义,或者我是否在为将来的问题做好准备.或者也许这个功能已经存在于objective-c中,我错过了这一点.提前致谢.

Rya*_*los 8

我认为对这样的事情更好的方法是UIColor本身的一类类方法.我经常为具有大量自定义颜色的项目编写颜色类别.

像这样的东西:

// UIColor+AppAdditions.h
@interface UIColor (AppAdditions)

+ (UIColor *)myDarkRed;

@end

// UIColor+AppAdditions.m

#import "UIColor+AppAdditions.h"

@implementation UIColor (AppAdditions)

+ (UIColor *)myDarkRed
{
    return [UIColor colorWithRed:0.1 green:0.0 blue:0.0 alpha:1.0];
}

@end
Run Code Online (Sandbox Code Playgroud)

这样你就不需要一个完整的Singleton而且它更易于使用,而Singleton做其他事情.你可以干净地访问你的颜色,如下所示:

[label setTextColor:[UIColor myDarkRed]];
Run Code Online (Sandbox Code Playgroud)

注意

如Rob和Paul所说.最好恰当地命名它们.我取了你的名字,但最好是专门为它们的名字命名,并遵循前缀和后缀等惯例.

  • 我是类别方法的粉丝并同意@RobNapier关于命名颜色的使用而不是它的实际实现(如果可能).需要考虑的是,坚持一致的命名风格通常更好 - 在这种情况下,在`UIColor`之后它应该是`<description> Color`.关于命名的另一点是你应该为添加了类别的方法使用前缀来避免方法名称冲突,例如我可能最终得到`pas_lightBackgroundColor`. (2认同)

Guo*_*uan 5

为什么不用macro

YourHelperClass.h

#define DARK_RED    [UIColor colorWithRed:0.1 green:0.0 blue:0.0 alpha:1.0]
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用(不要忘记导入YourHelperClass.h):

[label setTextColor:DARK_RED];
Run Code Online (Sandbox Code Playgroud)

我认为这是更好的用途 macro