我在视图控制器中有以下代码:
- (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也是实例变量的名称。
答案 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,即使它不是您提出的问题,也会有所帮助:)