为什么使用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];
}
答案 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_setAssociatedObject
和objc_getAssociatedObject
允许存储附加到其他对象的任意对象。所以基本上你在你的类别中定义了一个getter和setter,但是这些getter和setter不是设置(并获取)一个实例变量,而是调度到提到的Objective C运行时函数。
然而,这与绘制边界无关。该代码仍然必须明确地执行,例如,通过在关联对象的setter中调用它。