不能子类UIColor?

时间:2011-04-20 13:42:08

标签: objective-c ios subclass uicolor

我正在尝试将UIColor子类化,我似乎无法弄清楚出了什么问题。

在我的PColor.h中

#import <Foundation/Foundation.h>
@interface PColor : UIColor {
    BOOL isAvailable;
    int colorId;
}
@property (nonatomic, assign) BOOL isAvailable;
@property (nonatomic, assign) int colorId;
@end

...和我的PColor.m

#import "PColor.h"

@implementation PColor
@synthesize isAvailable;
@synthesize colorId;
@end

在实例化PColor对象时,我得到:

//warning: incompatible Objective-C types initializing 'struct UIColor *', expected 'struct PColor *'
PColor *pcolor = [[PColor alloc] initWithHue:1 saturation:0 brightness:0 alpha:1];

我错过了什么吗?提前谢谢。

4 个答案:

答案 0 :(得分:6)

UIColor类集群在类别中使用associative references来添加属性! UIColor上的所有自定义初始化方法都返回UIColor*而不是id,因此您不能轻易地将UIColor子类化,也不应该尝试。

的UIColor + PCOLOR.h

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@interface UIColor(PCOLOR)
//Properties prefixed to try and avoid future conflicts
@property (nonatomic, assign) BOOL pIsAvailable;
@property (nonatomic, assign) int pColorId;
@end

的UIColor + PCOLOR.h

#import "UIColor+PCOLOR.h"

@implementation UIColor(PCOLOR)

static char PCOLOR_ISAVAILABLE_KEY;
static char PCOLOR_COLORID_KEY;

@dynamic pIsAvailable, pColorId;

-(void)setPIsAvailable:(BOOL)pIsAvailable
{
    objc_setAssociatedObject(self, &PCOLOR_ISAVAILABLE_KEY, [NSNumber numberWithBool:pIsAvailable], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(BOOL)pIsAvailable
{
    return [(NSNumber*)objc_getAssociatedObject(self, &PCOLOR_ISAVAILABLE_KEY) boolValue];
}

-(void)setPColorId:(int)pColorId
{
    objc_setAssociatedObject(self, &PCOLOR_COLORID_KEY, [NSNumber numberWithInt:pColorId], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(int)pColorId
{
    return  [(NSNumber*)objc_getAssociatedObject(self, &PCOLOR_COLORID_KEY) intValue];
}

@end

USAGE

UIColor *pcolor = [[UIColor alloc] initWithHue:1 saturation:0 brightness:0 alpha:1];
pcolor.pColorId = 2352;
pcolor.pIsAvailable = YES;
NSLog(@"\nClass: %@\nColor ID: %d\nIs Availabled: %@", 
      NSStringFromClass([pcolor class]), 
      pcolor.pColorId, 
      pcolor.pIsAvailable ? @"YES" : @"NO");
[pcolor release];

答案 1 :(得分:5)

来自UIColor Class Reference

大多数开发人员不需要子类化UIColor。如果您需要支持其他颜色空间或颜色模型,那么唯一可能需要这样做。

你应该使用Category。例如:

@interface UIColor (PColor)
    - (BOOL) isAvailable;
    - (int) colorId;
@end

在实施文件中:

@implementation UIColor (PColor)

    - (BOOL)isAvailable {
        // do what you want to do
        // return your BOOL
    }

    - (int)colorId  {
        // do what you want to do
        // return id of color
    }

@end

答案 2 :(得分:1)

因为UIColor alloc可能不会按预期执行:分配UIColor的实例。它可能是一种工厂方法,它首先查看已使用的颜色或属于一组标准颜色并将其返回而不是创建新实例。在这种情况下,你将获得UIColor而不是PColors,这意味着继承UIColor不是一个好主意。

首选组合而不是继承 - 在PColor中嵌入UIColor。或者在UIColor上使用类别(在这种情况下你不能拥有新的实例变量)。

答案 3 :(得分:0)

与大多数类一样,UIColor的init方法返回UIColor *而不是id,因此您必须将其分配给UIColor而不是子类以避免警告。