无法从ViewController为UIView设置背景颜色

时间:2010-05-17 09:03:39

标签: iphone uikit colors

我在视图控制器中有以下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
 ThemeManager *themer = [ThemeManager sharedInstance];
 UIView *theView = self.view;
 UIColor *forBackground = [themer backgroundColour];
 [theView setBackgroundColor:forBackground];
}

但是当执行到达setBackgroundColor行时,我收到以下错误:

*** -[NSCFNumber CGColor]: unrecognized selector sent to instance 0x1237c40
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFNumber CGColor]: unrecognized selector sent to instance 0x1237c40'

我必须做一些简单的事我做错了,如何设置背景颜色?

我是否必须继承视图并在那里进行操作?我宁愿没有额外的课程,即使这是更好地分离整个模型/视图/控制器的东西。

更新:[themer backgroundColour]返回的值是使用colorWithPatternImage:构建的,这会有所不同吗?

更新:如果我在使用colorWithRed:green:blue:alpha:构建的ThemeManager中使用了一个值,它可以正常工作。有没有办法使用带背景图像的颜色来做到这一点?以下工作正常:

[theView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]];

更新:这也可行:

UIColor *forBackground = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]];
[theView setBackgroundColor:forBackground];

在我的原始示例中,从[themer backgroundColor]返回的对象是UIColor,那么问题是什么?

当我逐步使用调试器时:

UIColor *forBackground = [themer backgroundColour];

导致forBackground属于NSConstantValueExpression *

类型

UIColor *forBackground = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]];

导致forBackground属于UIDeviceRGBColor *

类型

以下是ThemeManager的backgroundColour方法的代码:

- (UIColor *)backgroundColour {
 if (backgroundColour == nil) {
  backgroundColour = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]];
 }

 return backgroundColour;
}

backgroundColour也是实例变量的名称。

3 个答案:

答案 0 :(得分:2)

问题是我retain中没有UIColor ThemeManager,所以它适用于第一个视图,而不是后续视图。

ThemeManager中的新代码:

backgroundColour = [[UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]] retain];

答案 1 :(得分:0)

这一行似乎返回了一个无效的实例:

UIColor *forBackground = [themer backgroundColour];

错误表明forBackground属于NSCFNumber类,而不是类UIColor类。请检查backgroundColour方法是否返回正确的类型。

<强>更新

您是否在此方法的调试器中检查了backgroundColour的值?

- (UIColor *)backgroundColour {
    if (backgroundColour == nil) {
        backgroundColour = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]];
    }
    return backgroundColour;
}

我怀疑创建实例时backgroundColour未设置为null。因此测试失败并且该方法返回随机引用。

答案 2 :(得分:0)

我可能好像themer返回一个数字而不是一个颜色,也许themer处理RGB十六进制值?

我有时使用Class Method +(UIColor *)getCustomColor:(CustomColorType)颜色构建一个customColor类;一旦确定了应用程序的颜色主题,我就会使用它,它还可以让您在一个地方更改颜色,并随时随地进行更改。我通常在0xFFFFFFFF值中执行此操作,因为这是大多数设计师处理颜色的方式。

这是我上一个项目的“复制浪费”:

//
//  CustomColor.h
//  FC
//
//  Created by RickiG on 12/19/09.
//  Copyright 2009 www.rickigregersen.com.. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef enum {

    CustomColorWhiteText, 
    CustomColorDarkGreyText, 
    CustomColorLightGreyText,
    CustomColorGreyText,
    CustomColorLightBlueText,
    CustomColorDarkWhiteText,
    CustomColorLightWhiteText,
    CustomColorLightPurpleText, 
    CustomColorOrange,
    CustomColorRed,
    CustomColorSilver,

} CustomColorType;

@interface CustomColor : NSObject {

}

+ (UIColor*) getCustomColor:(CustomColorType) color;

@end

实施:

//
//  CustomColor.m
//  FC
//
//  Created by RickiG on 12/19/09.
//  Copyright 2009 www.rickigregersen.com.. All rights reserved.
//

#import "CustomColor.h"


@implementation CustomColor

+ (UIColor*) getCustomColor:(CustomColorType) color {

    int value;

    switch (color) {

        case CustomColorWhiteText:
            value = 0xffffff;
            break;          
        case CustomColorDarkGreyText:
            value = 0x373737;
            break;
        case CustomColorGreyText:
            value = 0x7a7a7a;
            break;
        case CustomColorLightGreyText:
            value = 0xd3d3d3;
            break;          
        case CustomColorLightBlueText:
            value = 0x8ed6ff;
            break;  
        case CustomColorDarkWhiteText:
            value = 0x979797;
            break;  
        case CustomColorLightWhiteText:
            value = 0xe8e8e8;
            break;
        case CustomColorLightPurpleText:
            value = 0xd17efc;
            break;
        case CustomColorOrange:
            value = 0xfb8720;
            break;
        case CustomColorRed:
            value = 0xeb0008;
            break;
        case CustomColorSilver:
            value = 0xe3e3e3;
            break;

        default:
            value = 0x000000;
            break;
    }

    int r, g, b;
    b = value & 0x0000FF;
    g = ((value & 0x00FF00) >> 8);
    r = ((value & 0xFF0000) >> 16);

    return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f];
}

@end

这样我总能去:

[UIView setBackgroundColor:[CustomColor getCustomColor:CustomColorWhiteText];

从我项目的任何地方。 我有相同类型的文件来处理通过应用程序重用的文本标签,按钮和其他界面元素。

希望如果您正在构建一个能够即时更改其外观的UI,即使它不是您提出的问题,也会有所帮助:)