【问题标题】:Using #define to create styles使用#define 创建样式
【发布时间】:2011-12-09 23:08:26
【问题描述】:

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

例如,

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

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

【问题讨论】:

    标签: objective-c syntax coding-style c-preprocessor


    【解决方案1】:

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

    相反,我倾向于认为您最好为此创建一个类层次结构,并将其实现为单例。使用类层次结构,您可以在根类中定义任何通用样式行为,然后从中继承以实现特定样式。稍后,您可以根据需要向用户公开选择样式的能力。

    【讨论】:

    • 谢谢罗伯。这听起来很强大。我会寻找类似的代码示例。
    • 我认为最好的方法是使用单例并将颜色和所有内容定义为 xml (plist) 文件。如果您希望用户在运行时更改样式,则不能使用预处理器。如果你想要不同风格的不同应用版本,我推荐预处理器。
    • 我认为这对我来说是最好的解决方案,因为我希望人们能够在运行时更改设置。我已经创建了 xml 文件,所以我只需要解析它,就完成了。非常感谢你们所有人。我希望我能把你们都标记为解决了我的问题。我已经给你们所有人加分了。大卫
    【解决方案2】:

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

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

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


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

    另一种选择是改用const

    在我编写的代码中,我有 #defines 用于字符串文字 @"literal string" 和数字。在其他地方,我使用const 声明,如下所示:

    //static type *const variableName = assignment;
    
    static NSString *const kConstantString = @"Constant variable";
    

    常量不使用预处理器来填充信息。如果您经常访问定义并且它使用一些计算,它可能更适合只存储一次的常量声明。

    我使用const 而不是#define 的另一个重要原因是define 没有经过类型检查,因为它是由预处理器处理的。定义基本上关闭编译器警告,只给你错误;严格的警告非常有帮助,可以减少很多挫败感。

    【讨论】:

    • 感谢您的洞察力。我尝试使用这样的常量: static NSString *const kBlack = @"[UIColor: colorNamed blackColor]";但我收到不兼容指针类型的警告..
    • 您将方法调用放在字符串中。那不行。
    • 这将起作用:#define defColor [UIColor redColor] 然后self.view.backgroundColor = defColor;
    • 谢谢乔,但是如果我想要几个语句——文本信息、颜色信息等怎么办。我想我正在寻找一些宏函数..
    • 什么意思?就像在定义中编写多行代码一样?这对我来说听起来很难。
    【解决方案3】:

    也许您正在寻找这种语法:

    设置样式

    #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

    【讨论】:

    • 感谢 Sulthan,“Style1”的代码是什么样的?它只是我放在大括号中的任何内容吗?
    • 完全可以有任何东西。在编译过程中,只有一个块被编译,其他块不存在。我举个例子。
    猜你喜欢
    • 2019-11-17
    • 2020-12-24
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多