向我的所有UIControl添加属性

时间:2013-02-26 12:12:02

标签: ios objective-c cocoa-touch uicontrol

我试图让我的应用程序中的每个UIControlUIButtonUISlider等)都有我添加的特殊额外属性。

我尝试通过创建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 个答案:

答案 0 :(得分: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 Docs

答案 1 :(得分:1)

self.specialproperty=param与调用[self setSpecialproperty]完全相同(有关完全没有偏见的Obj-C点符号的覆盖范围,请参阅here),这使您的当前使用无限递归。

你真正想做的是:

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

_specialproperty是您的财产隐式创建的ivar

我假设您已经实施了setSpecialproperty制定者的原因?为什么不使用为您隐式创建的那个呢?

答案 2 :(得分:1)

问题是你不能将属性添加到类别,你可以添加行为(方法)但不能添加属性或属性,这只能用于扩展,而你不能创建SDK类的扩展

答案 3 :(得分:-1)

将您的方法用作

将您的方法名称更改为

-(void)setSpecialproperty:(MySpecialProperty *)specialproperty

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

并将您的specialProperty合成为

@synthesize specialproperty=_specialproperty;