添加一个属性到我所有的UIControls
我试图做到这一点,使我的应用程序( UIButton
, UISlider
等)中的每个UIControl
都具有特殊的额外属性,我添加到他们。
我试图通过创build一个UIControl
类别并在需要的地方导入它来实现这一点,但我有问题。
这是我的代码。
我的setSpecialproperty
方法被调用,但它似乎被调用在一个无限循环,直到应用程序崩溃。
你能告诉我什么我做错了或build议一个更聪明的方式来添加一个属性到我所有的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];
虽然你不能通过一个类别添加一个iVar到UIControl,你可以添加关联对象,它可以用来执行很多相同的function。
所以,像这样在UIControl上创build一个类别:
static char kControlNameKey; - (void) setControlName: (NSString *) name { objc_setAssociatedObject(self, &kControlNameKey, name, OBJC_ASSOCIATION_COPY); } - (NSString *) controlName { return (NSString *)objc_getAssociatedObject(array, &kControlNameKey); }
除此之外还有更多,我猜你需要在设置一个新的之前检查一个关联是否存在,否则会泄漏,但这应该给你一个开始。
有关更多详细信息,请参阅Apple文档
self.specialproperty=param
与调用[self setSpecialproperty]
完全相同(请参阅这里的一些完全没有偏见的Obj-C点符号的覆盖),这使得您的当前用法无限recursion。
你真正想要做的是:
-(void)setSpecialproperty:(MySpecialProperty*)param { _specialproperty = param; }
在哪里_specialproperty
是隐式创build你的财产ivar
。
我假设你为什么实现你的setSpecialproperty
setter有一些原因? 为什么不使用为你隐式创build的那个?
问题是你不能添加一个属性到一个类别,你可以添加行为(方法),但不是属性或属性,这只能做到扩展,你不能创buildSDK类的扩展
使用你的方法
改变你的方法名称
-(void)setSpecialproperty:(MySpecialProperty *)specialproperty -(void)setSpecialproperty:(MySpecialProperty*)specialproperty { if(_specialproperty!=specialproperty) _specialproperty = specialproperty; }
并把你的specialProperty合成为
@synthesize specialproperty=_specialproperty;