我试图让我的应用程序中的每个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];
答案 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;