使用objc_setAssociatedObject设置边框颜色不起作用

时间:2015-02-20 14:54:39

标签: ios objective-c

为什么使用objc_setAssociatedObject设置边框颜色不起作用?

如果你也解决了这个问题,那就会upvote(假设你可以让objc_setAssociatedObject工作):在这个例子中使用objc_setAssociatedObject有什么好处?

编辑:我不是在寻找如何设置边框颜色。但是为了这个目的,我在第三方库中看到了objc_setAssociatedObject的使用,并且无法在我的测试样本上尝试它。

Edit2:根据@Leo的评论,我终于弄清楚我对这种用法的误解是什么。它实际上是在对象中添加属性。演示:

添加此方法:

-(UIColor *)borderColor
{
    return objc_getAssociatedObject(label1, kBorderColorKey);
}

这条线将起作用:

label1.layer.borderColor = [[self borderColor] CGColor];


static char * kBorderColorKey = "border color key";
-(void)setColorButton:(id)sender
{
    NSLog(@"setColorButton");

    //This line does not work
    objc_setAssociatedObject(label1, kBorderColorKey, [UIColor redColor], OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    //This line works
    label1.layer.borderColor = [[UIColor redColor] CGColor];
}

2 个答案:

答案 0 :(得分:2)

为任意键设置关联对象将不具有特定行为。如果你曾经使用过:

static char * kBorderColorKey = "layer.borderColor";

我更愿意相信它可能会奏效。它不会赢,但它至少看起来可能。使用"border color key"与使用"do magic because I want you to"来完成相同的结果大致相同。

由于图层borderColor在创建时未被指定为关联对象,因此您无法以这种方式更改其值。为了通过KVO正确访问它,您可以考虑这样做:

[label1 setValue:[[UIColor redColor] CGColor] forKey:@"layer.borderColor"];

但是,我不明白为什么你不能使用已经有效的线路:

label1.layer.borderColor = [[UIColor redColor] CGColor];

答案 1 :(得分:1)

您发现的是一种广泛使用的机制,可以通过类别向第三方类添加属性。 objc_setAssociatedObjectobjc_getAssociatedObject允许存储附加到其他对象的任意对象。所以基本上你在你的类别中定义了一个getter和setter,但是这些getter和setter不是设置(并获取)一个实例变量,而是调度到提到的Objective C运行时函数。

然而,这与绘制边界无关。该代码仍然必须明确地执行,例如,通过在关联对象的setter中调用它。