【发布时间】:2014-01-19 02:29:18
【问题描述】:
这是我的代码:
@interface SubColor : UIColor
@property (atomic, assign) int key;
+ (id)colorWithkey:(int)key color:(UIColor *)color;
@end
@implementation SubColor
- (id)initWithCGColor:(CGColorRef)cgColor withkey:(ThemeConfigKey)key{
if (self = [super initWithCGColor:cgColor]) {
_key = key;
}
return self;
}
- (BOOL)isKindOfClass:(Class)aClass{
NSLog(@"isKindOfClass:%@", NSStringFromClass(aClass));
return [super isKindOfClass:aClass];
}
+ (id)colorWithkey:(int)key color:(UIColor *)color{
SubColor *subColor = [[SubColor alloc] initWithCGColor:color.CGColor withkey:key];
if([subColor isKindOfClass:[SubColor class]]){
NSLog(@"123");
}
return subColor;
}
@end
NSLog 不输出@"isKindOfClass:%@" 和@"123"。那是因为 SubColor 实例只是一种 UIColor 类而不是 SubColor 类。当颜色在其他地方使用时,如何知道颜色是我自己的 SubColor?
另外,here 中讨论的一些方法由于某种原因并不完美。因为 UIColor 在某些情况下会被系统重用!如果两种颜色包含相等的 RGB 值,则可以将具有“A”颜色的关联键替换为具有“B”颜色的关联键。这让我抓狂!
【问题讨论】:
-
为了清楚起见,您是说在另一个问题中使用该解决方案的问题是因为您可能需要具有相同 RGB 值且具有两个不同主题键的两种颜色?如果
UIColor在这种情况下返回相同的实例,那将是一个问题。 -
@rmaddy 两种颜色具有相同的 RGB 值,具有两个不同的主题键是我需要的,我的问题是 UIColor 有时会被系统重用。通过我对 NSLog 输出的练习,UITableViewCell 上的 textLabel使用“a”键和值“0xffffff”设置文本颜色,在单元格布局子视图方法之后,将 textLabel 文本颜色替换为具有“b”键和值“0xffffff”的颜色。通过跟踪,带有“b”键和值“0xffffff”的颜色被navigationBar titleView使用,它也是一个UILabel。
-
对,这证实了我认为你的意思。由于
UIColor似乎为某些常见颜色返回了一些固定实例,这使您想做的事情变得非常困难。如何创建你的类,使其扩展NSObject而不是UIColor并具有两个属性 - 你的密钥和UIColor? -
这也很难,我的类也应该可以通过系统UILabel textColor和其他使用UIColor的方法来访问。并非所有颜色都是由我的方法创建的。从 UIColor 继承符合我的要求。但是现在我不知道如何判断 UIColor 是我的 subColor。那是克雷!
-
那你就卡住了。
UIColor不能正确支持子类化,因为它返回一些固定的颜色实例,并且您的需要阻止使用具有UIColor属性的类。您需要另一种方法来跟踪颜色与哪个主题相关联。在不了解您的需求的情况下,很难提供其他建议。
标签: ios objective-c