Adding a property to all of my UIControls

試著忘記壹切 提交于 2019-12-11 16:49:33

问题


Im trying to make it so that every single UIControl in my application (UIButton, UISlider, etc) all have special extra properties that I add to them.

I tried to accomplish this by creating a UIControl Category and importing it where needed but I have issues.

Here is my code.

My setSpecialproperty method gets called but it seems to be getting called in an infinite loop until the app crashes.

Can you tell me what Im doing wrong or suggest a smarter way to add a property to all of my 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];

回答1:


While you can't add an iVar to UIControl via a category, you can add Associated Objects, which can be used to perform much the same function.

So, create a category on UIControl like this:

static char kControlNameKey;

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

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

There's more to it than that, I guess you'll need to check if an association exists before setting a new one, otherwise it will leak, but this should give you a start.

See the Apple Docs for more details




回答2:


self.specialproperty=param is exactly the same as calling [self setSpecialproperty] (see here for some totally non biased coverage of Obj-C dot notation), which makes your current usage infinitely recursive.

What you actually want to do is:

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

Where _specialproperty is the implicitly created ivar for your property.

I'm assuming there's some reason why you've implemented your setSpecialproperty setter? Why not just use the one that is implicitly created for you?




回答3:


the problem is that you can not add a property to a category, you can add behavior (methods) but not properties or attributes, this can only be done to extensions, and you can not create extensions of the SDK classes




回答4:


use your method as

change your method name to

-(void)setSpecialproperty:(MySpecialProperty *)specialproperty

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

and synthesize your specialProperty as

@synthesize specialproperty=_specialproperty;


来源:https://stackoverflow.com/questions/15088842/adding-a-property-to-all-of-my-uicontrols

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!