2013-02-26 28 views
0

我試圖使它在我的應用程序中的每個UIControlUIButton,UISlider等)都具有特殊的額外屬性,我將它們添加到它們中。將屬性添加到我的所有UIControls

我試圖通過創建一個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]; 
+1

您不需要創建setter方法。編譯器已經爲你做到了。只要打電話吧! – CainaSouza 2013-02-26 12:13:48

回答

2

儘管您無法通過類別向UIControl添加iVar,但您可以添加關聯對象,它可用於執行相同的功能。

因此,創建這樣的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

+0

ObjC運行時FTW! – dubbeat 2013-02-26 13:18:30

1

self.specialproperty=param是完全一樣調用[self setSpecialproperty](請參閱here,對於某些完全沒有偏見的覆蓋了Obj-C點符號),這會使您的當前用法無限遞歸。

你真正想要做的是:

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

_specialproperty是隱含您的屬性創建ivar

我假設你爲什麼實施setSpecialproperty二傳手是有原因的?爲什麼不使用爲你隱式創建的那個?

-1

使用方法

你的方法名稱更改爲

-(void)setSpecialproperty:(MySpecialProperty *)specialproperty 

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

和綜合您的specialProperty作爲

@synthesize specialproperty=_specialproperty; 
+0

合成屬性並不是絕對必要的(因爲Xcode 4.4:http://stackoverflow.com/questions/12933785/ios-automatic-synthesize-without-creating-an-ivar) – sjwarner 2013-02-26 12:28:38

+0

如果您使用版本5.1+ – Warewolf 2013-02-26 12:29:22

1

的問題是,你不能將屬性添加到一個類別,您可以添加行爲(方法),但不能添加屬性或屬性,只能對擴展進行添加,並且不能創建SDK類的擴展

+0

所以不需要我想做什麼是不可能的? – dubbeat 2013-02-26 12:44:26

+0

你試圖做的方式,是的,這是不可能的,@VineetSinghRawat給你一個選項,它可能似乎有點複雜,但它不是,只是仔細閱讀它 – tkanzakic 2013-02-26 12:51:13

+1

這[文章](http:// www .cocoanetics.com/2012/06/associated-objects /)可能*更容易*讀取比Apple Doc – tkanzakic 2013-02-26 12:53:37