【问题标题】:Objective C defining UIColor constantsObjective C 定义 UIColor 常量
【发布时间】:2011-02-18 22:22:42
【问题描述】:

我有一个 iPhone 应用程序,为我的主题提供了一些自定义颜色。由于这些颜色将为我的 UI 固定,因此我想在要包含的类中定义颜色(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];

谢谢!

【问题讨论】:

    标签: iphone c objective-c constants globals


    【解决方案1】:

    如果您正在寻找一个没有扩展的快速而肮脏的,请使用clang

    #define kGreenColor colorWithRed:(0/255.0) green:(213/255.0) blue:(90/255.0) alpha:1.0
    
    - (void)doSomething
    {
       _label.textColor = [UIColor kGreenColor];
    
    }
    

    【讨论】:

      【解决方案2】:

      这是另一种方式:

      标题:

      #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
      

      这有点小技巧,但您不需要在实现中重新定义颜色,并且无需方法调用即可访问颜色。

      【讨论】:

        【解决方案3】:

        为简单起见,我这样做了:

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

        不要忘记省略';'所以你可以把它当作一个普通的表达式来使用。

        我不确定这种方法在技术上是否有任何问题,但它工作正常,并且避免了编译时常量初始化程序错误 - 此代码有效地卡在您放置“myColor”的任何位置,所以它不会在你真正使用它之前永远不会被编译。

        【讨论】:

        • 有趣的方法!我很想知道为什么';'可以排除在外吗?这个怎么称呼?
        • 这是一个预处理器宏。有效地,“myColor”在您的代码中出现的任何地方都被替换为完整的“[UIColor colorWith...”代码行,在它编译之前。你省略了';'在宏中,因此您可以使用这样的代码:UIColor *color = myColor; 而不是 UIColor *color = myColor,这看起来不像是正常的代码行(在任何代码行的末尾放置分号更自然)。可以省略它,因为预处理器宏在使用时会按原样进行评估,因此只要在实际代码中放置一个分号,就可以了。
        • 但是这不是每次使用这个宏时都会创建一个这个颜色的新实例吗?考虑将其置于具有 1000 次迭代的 for 循环中,并将其作为背景色分配给视图。这不是很有效吗?
        • 确实如此,但是您将在哪里使用此 1000 次?此外,如果您要正常创建颜色,情况也是如此。这只是让您可以方便地定义一次颜色,以便轻松更改它。这里的答案中提到的其他方法当然会避免创建这些多个实例,但在我看来,它们需要更多的工作来实现并且不太优雅。您可能在视图中使用它的次数所产生的实际开销应该可以忽略不计。不过只是我的两美分 FWIW。
        【解决方案4】:

        另一种选择

        在你的 .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
        

        【讨论】:

        • 这个多变的 C++ 动态常量是什么? ;) +1
        • 我也很想知道为什么会这样。
        • 这是可能的,因为T* const 是一个指向常规对象的常量指针(您无法修改此类指针指向的位置),而const T* 是一个指向常量对象的指针(不能通过这样的指针修改对象)。
        【解决方案5】:

        使用 AppController 使颜色可以全局访问,而不是静态变量。这样从架构的角度来看是有意义的,而且如果您想假设更改配色方案,即使在运行时,这也只是 AppController 上的一两个方法

        【讨论】:

        • AppController - 我猜你指的是 UIApplication 委托?
        • 在运行时更改颜色在大多数应用程序中将是一项更大的任务。使用与应用程序委托无关的代码来污染应用程序委托也是一种好方法。
        【解决方案6】:

        人们通常将全局常量放入单例对象中 - 或者如前所述,您可以通过某个类的类方法使它们可访问。

        【讨论】:

          【解决方案7】:

          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
          

          【讨论】:

          • -1 对于第一句 - Initializer 不是常量,不是实例。出于所有意图和目的,UIColor 可能(或可能明天)包含未向用户公开的内部状态变量,使它们在我们看来是恒定的,但是 Obj-C 中没有任何东西强迫这一点。因此编译器不能像它想的那样使用静态初始化器,因为 [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0] 是一个方法调用,因此这个结果不能放在文本段中,它是在编译时创建的。
          • Mutable 表示可以更改实例。不可变意味着您不能更改实例。常量意味着不能更改实例。 UIColor 不是可变的,也不是恒定的。只有 CFString/NSString 具有真正的常量实例,因为它们作为语言的一部分被编译器专门处理。
          • 你能解释一下什么是(MyProject)。我正在尝试在基于 NSObject 的类中使用它,语法是 @interface Common : NSObject
          • @ToughGuy - 这是一个扩展。 “MyProject”消息有点无关紧要,但很有必要(我不知道为什么,但你我用(extension) 代替)所以你可以把它留在那里。像这样使用:[UIColor colorForSomePurpose] 就像你会红色 [UIColor red] 等等。[self.view setBackgroundColor: [UIColor colorForSomePurpose] ];
          猜你喜欢
          • 2011-02-12
          • 1970-01-01
          • 1970-01-01
          • 2013-04-11
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 2012-07-14
          • 1970-01-01
          相关资源
          最近更新 更多