[問題] 用category加member (Associated reference)

看板MacDev作者 (2A3C好聲好好聽)時間14年前 (2011/03/25 12:17), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串1/1
版上大大看到一定會說category不能加member 請用subclass... 不過小弟還是想說明一下狀況,也許大家會有更好的方法。 過去我都在玩cocos2d,CCNode裡本身就有一個userdata的變數可以供自由使用。 然而在UIKit裡的UIView似乎沒有留下這樣一個空間, 最簡單的方式就是去繼承UIView,然後自己塞一個id userdata進去。 但是我希望的是,所有繼承UIView的class都有userdata可以用。 也就是說,如果能讓UIView可以set/get userdata, 那UIImageView, UIScrollView, UIxxxView都可以有userdata可以用。 小弟在網路上爬文後,發現可以用Associate reference + catgegory的方式實現 測試也成功了,但是網路上沒看到實際範例,所以想請版上大大們幫忙check一下 首先先建一個class //UserData.h #import <Foundation/Foundation.h> @interface UserData : NSObject { NSString *name; } @property (nonatomic, retain) NSString *name; @end //UserData.m #import "UserData.h" @implementation UserData @synthesize name; @end 再來是myuserdata category //myuserdata.h @interface UIView (myuserdata) - (void)setUserData:(NSString *)string; - (NSString *)userData; @end //myuserdata.m #import "myuserdata.h" #import "UserData.h" #import <objc/runtime.h> static char key; @implementation UIView (myuserdata) - (void)setUserData:(NSString *)string { if (!objc_getAssociatedObject(self, &key)) { UserData *data = [[UserData alloc] init]; objc_setAssociatedObject(self, &key, data, OBJC_ASSOCIATION_RETAIN_NONATOMIC); [data release]; } UserData *userdata = objc_getAssociatedObject(self, &key); userdata.name = string; } - (NSString *)userData { UserData *userdata = objc_getAssociatedObject(self, &key); return userdata.name; } @end 我是在iOS下UIViewController裡測 - (void)viewDidLoad { [super viewDidLoad]; UIView *myclass = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; [myclass setBackgroundColor:[UIColor redColor]]; [myclass setUserData:@"this is myclass userdata"]; [self.view addSubview:myclass]; [myclass release]; NSLog([myclass userData]);   UIImageView *imag = [[UIImageView alloc] initWithFrame:CGRectMake(200, 200, 100, 100)]; [imag setImage:[UIImage imageNamed:@"AudioImage.png"]]; [imag setBackgroundColor:[UIColor blueColor]]; [imag setUserInteractionEnabled:YES]; [imag setUserData:@"this is imag userdata"]; [self.view addSubview:imag]; [imag release]; NSLog([imag userData]); } 可以work,這麼做是ok的嗎? 還是有其它更好的方法? (不好意思,code直接放bbs,傷大家眼睛了) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.120.152 ※ 編輯: kevwalker 來自: 140.115.120.152 (03/25 12:18)

03/25 13:30, , 1F
感謝分享..又學到一招!!
03/25 13:30, 1F

03/25 20:04, , 2F
UIView的layer是Key-value compliant的。
03/25 20:04, 2F

03/25 20:05, , 3F
03/25 20:05, 3F

03/26 02:49, , 4F
咦?Key-value compliant好棒,感謝分享。
03/26 02:49, 4F
文章代碼(AID): #1DZ1TIh5 (MacDev)
文章代碼(AID): #1DZ1TIh5 (MacDev)