2011-12-13 4 views
3

オブジェクト値または任意の値を保持するsetUserDataメソッドを組み込むようにUIViewクラスを拡張しようとしています。UIViewカテゴリとプロパティ

userDataは.hファイルのidプロパティとして定義されています。

@implementation UIView (Extensions) 

@synthesize userData; 

-(void) setUserData:(id)value 
{ 
    self.userData = value; 
} 

@end 

もちろん、xCodeはカテゴリで@synthesizeを使用できないと言っています。どのように私はこのタスクを達成することができますか、多分オブジェクトを保持することができるUIViewにいくつかのプロパティがあります。 tagプロパティと同じように、tagプロパティはintegarsのみを保持します。

+0

[サブクラス化することなく、UIコントロールにプロパティを追加する]の可能な重複(http://stackoverflow.com/questions/8492602/adding-properties-to-uicontrols-without-subclassing) – Caleb

+0

上記連結重複問題は本質的にこれと同じですが、ビューの代わりにコントロールを要求します(コントロール*はビューです)。 Rob Napierの答え、特に連想参照に関しての答えを参照してください。 – Caleb

答えて

5

あなたが述べたように、カテゴリのプロパティは合成できません。これを達成するには、関連オブジェクトと呼ばれるObj-Cランタイム機能を使用する必要があります。

#import <objc/runtime.h> 

const char * const viewKey = "jweinberg.view.storage"; 

@implementation UIView (Storage) 

- (id)myProperty; 
{ 
    return objc_getAssociatedObject(self, viewKey); 
} 

- (void)setMyProperty:(id)property; 
{ 
    objc_setAssociatedObject(self, viewKey, property, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
関連する問題