0

我试图让UIControl我的应用程序(UIButton,UISlider等)中的每一个都具有我添加到它们的特殊额外属性。

我试图通过创建一个UIControl类别并在需要的地方导入它来实现这一点,但我遇到了问题。

这是我的代码。

我的setSpecialproperty方法被调用,但它似乎在无限循环中被调用,直到应用程序崩溃。

你能告诉我我做错了什么或建议一种更聪明的方法来为我的所有财产添加一个属性UIControls吗?

@interface UIControl (MyControl)
{

}
@property(nonatomic,strong) MySpecialProperty  *specialproperty;

-(void)setSpecialproperty:(MySpecialProperty*)param;
@end

////////

#import "UIControl+MyControl.h"

@implementation UIControl (MyControl)

-(void)setSpecialproperty:(MySpecialProperty*)param
{
    self.specialproperty=param;
}

///////////////

#import "UIControl+MyControl.h"

@implementation ViewController


UIButton *abutton=[UIButton buttonWithType:UIButtonTypeCustom];
MySpecialProperty *prop=[MySpecialProperty alloc]init];
[abutton setSpecialproperty:prop];
4

4 回答 4

2

虽然您无法通过类别将 iVar 添加到 UIControl,但您可以添加关联对象,它可用于执行几乎相同的功能。

因此,像这样在 UIControl 上创建一个类别:

static char kControlNameKey;

- (void) setControlName: (NSString *) name
{
    objc_setAssociatedObject(self, &kControlNameKey, name, OBJC_ASSOCIATION_COPY);
}

- (NSString *) controlName
{
    return (NSString *)objc_getAssociatedObject(array, &kControlNameKey);
}

不仅如此,我想您需要在设置新关联之前检查关联是否存在,否则它会泄漏,但这应该给您一个开始。

有关更多详细信息,请参阅Apple 文档

于 2013-02-26T12:23:42.753 回答
1

问题是您不能将属性添加到类别,可以添加行为(方法)但不能添加属性或属性,这只能对扩展进行,并且您不能创建 SDK 类的扩展

于 2013-02-26T12:21:09.610 回答
1

self.specialproperty=param与调用完全相同(有关 Obj-C 点表示法的一些完全无偏见[self setSpecialproperty]的覆盖,请参见此处),这使您当前的使用无限递归。

你真正想做的是:

-(void)setSpecialproperty:(MySpecialProperty*)param
{
  _specialproperty = param;
}

为您的财产_specialproperty隐式创建的位置在哪里。ivar

我假设您实施setSpecialpropertysetter 是有原因的?为什么不只使用为您隐式创建的那个?

于 2013-02-26T12:14:22.907 回答
-1

使用你的方法

将您的方法名称更改为

-(void)setSpecialproperty:(MySpecialProperty *)specialproperty

-(void)setSpecialproperty:(MySpecialProperty*)specialproperty
{
   if(_specialproperty!=specialproperty)
  _specialproperty = specialproperty;
}

并将您的 specialProperty 合成为

@synthesize specialproperty=_specialproperty;
于 2013-02-26T12:19:17.733 回答