Ios 使用objc_setAssociatedObject设置边框颜色无效

Ios 使用objc_setAssociatedObject设置边框颜色无效,ios,objective-c,Ios,Objective C,为什么使用objc_setAssociatedObject设置边框颜色不起作用 假设您可以使objc_setAssociatedObject正常工作,如果您也解决了这个问题,您会投票吗:在这个示例中使用objc_setAssociatedObject有什么好处 编辑:我不是在寻找如何设置边框颜色。但是我看到了第三方库中的objc_setassociated对象用于此目的,因此无法在我的测试样本上尝试 编辑2:通过@Leo的评论,我终于明白了我对这个用法的误解。它实际上是在向对象添加属性。要演示:

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

假设您可以使objc_setAssociatedObject正常工作,如果您也解决了这个问题,您会投票吗:在这个示例中使用objc_setAssociatedObject有什么好处

编辑:我不是在寻找如何设置边框颜色。但是我看到了第三方库中的objc_setassociated对象用于此目的,因此无法在我的测试样本上尝试

编辑2:通过@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];
}

为任意键设置关联对象不会有特定行为。如果您使用了:

static char * kBorderColorKey = "layer.borderColor";
我更愿意相信它可能会起作用。不会的,但至少看起来有可能。使用边框颜色键与使用do magic大致相同,因为我希望您实现相同的结果

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

[label1 setValue:[[UIColor redColor] CGColor] forKey:@"layer.borderColor"];
然而,我不明白你为什么不使用你已经有的行:

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

您所发现的是一种广泛使用的通过类别向第三方类添加属性的机制。objc_setAssociatedObject和objc_getAssociatedObject允许存储附加到其他对象的任意对象。因此,基本上您在类别中定义了一个getter和setter,但是这些getter和setter并没有设置和获取一个实例变量,而是分派给前面提到的Objective C运行时函数


然而,这与边界的绘制毫无关系。此代码仍然需要明确执行,例如,从关联对象的setter中调用它。

为什么这样做?@leo:代码来自此库:在UIView+Border中。如果您知道它为什么不工作,请说明原因。这就是问题所在。为什么要等一段时间再投否决票?我个人并没有否决你的问题。你想要实现的东西和你发布的代码完全不相关,所以我很好奇是什么给你留下了这样的印象…提到的库所做的是:它向每个UIView添加了一个borderColor属性-它允许存储与每个view实例关联的NSColor。但这与实际的边界绘制无关,而实际的边界绘制发生在这里