[問題] 用category加member (Associated reference)
版上大大看到一定會說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
03/25 20:04, 2F
→
03/25 20:05, , 3F
03/25 20:05, 3F
推
03/26 02:49, , 4F
03/26 02:49, 4F
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章