2011-12-09 49 views
0

我想知道是否可以使用一系列#DEFINE为我的应用创建样式选项。使用#define创建样式

例如,

#DEFINE style1: backGroundColor = [UIColor: colorNamed whiteColor]; 
txtColor = [UIColor blackColor]; #DEFINE style2.... 

我的问题是:什么是这个语句的语法?

回答

3

虽然它肯定可以使用DEFINE语句来为您的应用程序创建样式的选择,我想知道如果使用预处理指令的有意义的功能,如样式,这些样式将成为属性的集合。如果使用DEFINE语句来定义样式,则最终难以将样式选择作为运行时选项提供给用户。

相反,我倾向于认为为此创建类层次结构并将其作为单例实现将会更好。通过类层次结构,您可以在根类中定义任何常规样式行为,然后从中继承以实现特定的样式。稍后,如果需要,可以向用户公开选择样式的功能。

+0

谢谢Rob。这听起来很健壮。我将寻找类似的代码示例。 –

+1

我最好的办法是使用单例,并将颜色和一切定义为一个xml(plist)文件。如果您希望用户在运行时更改样式,则不能使用预处理器。如果你想要不同风格的不同应用程序版本,我推荐预处理器。 – Sulthan

+0

我认为这对我来说是最好的解决方案,因为我希望人们能够在运行时更改设置。我创建了xml文件,所以我只需要解析它,然后完成。非常感谢你们所有人。我希望我能够将你们全部标记为解决了我的问题。我已经注意到你们了。大卫 –

1

#define backgroundColor [UIColor whiteColor]然后使用它你会说UIColor *txtColor = backgroundColor;

虽然您可能只能使用whiteColor作为定义而不是[UIColor whiteColor]。然后您会拨打[UIColor backgroundColor];而不是上面的示例。

我不会这样做来生成样式。定义代码之外的各种设置将是一个好主意,但使用define是相当具有约束力的,并且破坏了将UI与代码分离的目的。


#define不要在任何地方放一个分号。当预处理器插入定义时,它将插入任何分号,就像它一样; 你不希望预处理器插入分号。在编写定义时,您可能并不知道要编写它的所有位置,因此您不应该在其中包含分号,因为您可能会将它写入内联表达式中。

另一种选择是使用const代替。

在我写的代码中,我有#define s用于字符串文字@"literal string"和数字。在其他地方,我用的是const声明看起来像这样:

//static type *const variableName = assignment; 

static NSString *const kConstantString = @"Constant variable"; 

常量不使用预处理程序填写的信息。如果你经常访问一个定义,并且它使用了一些计算,它可能会更适合一个只存储一次的常量声明。

我使用const而不是#define的另一个重要原因是,由于预处理器处理了define,因此未进行类型检查。定义基本上关闭编译器的警告,只会给你错误;严格的警告是非常有用的,可以节省很多挫折。

+0

谢谢你的洞察力。我尝试使用这样的常量:静态NSString * const kBlack = @“[UIColor:colorNamed blackColor]”;但是我得到了不兼容指针类型的警告。 –

+0

您正在将一个方法调用放入一个字符串中。那不会。 – JoePasq

+0

这会起作用:'#define defColor [UIColor redColor]'then'self.view.backgroundColor = defColor;' – JoePasq

1

也许您正在寻找这样的语法:

设置样式

 

#define STYLE1 
//#define STYLE2 
 

,然后在你的代码(类级别或方法级别,页眉或实现文件)的任何地方。

 

#ifdef STYLE1 
    //code for the first style 
    UIColor* backgroundColor = [UIColor redColor]; 
#elif STYLE2 
    //code for the second style 
    UIColor* backgroundColor = [UIColor greenColor]; 
#else 
    //code for the third style 
    UIColor* backgroundColor = [UIColor clearColor]; 
#endif 

 

更多关于C预处理:http://en.wikipedia.org/wiki/C_preprocessor

+0

感谢Sulthan,“Style1”代码的外观如何?这只是无论我把它放入大括号吗? –

+0

可以有任何东西。编译期间,只编译一个块,其他块不在那里。我会举一个例子。 – Sulthan