iOS中关联对象的简单使用objc_setAssociatedO

2018-04-13  本文已影响0人  福将的逆袭

iOS中关联对象的简单使用objc_setAssociatedObject

首先看一下此方法接收的参数

objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

被关联的对象,下面举的例子中关联到了UIAlertView

要关联的对象的键值,一般设置成静态的,用于获取关联对象的值

要关联的对象的值,从接口中可以看到接收的id类型,所以能关联任何对象

关联时采用的协议,有assign,retain,copy等协议,具体可以参考官方文档

具体用法一:

- (void)viewDidLoad {    

[superviewDidLoad];

NSString*firsrString =@"我是第一个按钮";

// �传入的对象可以是字符串,字典,数组类型

NSString*secondString =@"我是第二个按钮";

UIButton*btn = [[UIButtonalloc] initWithFrame:CGRectMake(100,100,150,50)];   

 [btn setBackgroundColor:[UIColorredColor]];    

[btn setTitle:@"按钮传值"forState:UIControlStateNormal];  

  [self.view addSubview:btn];      

  objc_setAssociatedObject(btn,"firstObject", firsrString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);    objc_setAssociatedObject(btn,"secondObject", secondString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);   

 [btn addTarget:selfaction:@selector(click:) forControlEvents:UIControlEventTouchUpInside];}

- (void)click:(UIButton*)sender{

idfirst = objc_getAssociatedObject(sender,"firstObject");

idsecond = objc_getAssociatedObject(sender,"secondObject");

NSLog(@"%@--%@", first, second);

}

解释一下:

第一步: 设定关联objc_setAssociatedObject(btn, "firstObject", someObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);第一个参数:btn为被关联者(主体),第二个参数:firstObject为指向关联的对象的指针(一般为一个static字符串),第三个参数:关联的对象实例,第四个对象:关联的方式(有几种,类似设定.h文件属性时候的 assign,retain等)

第二步:得到关联的对象

id first = objc_getAssociatedObject(btn, "firstObject");第一个参数:为被关联者第二个参数:为关联对象的指针。

具体用法二:

tableview 点击 cell上的编辑按钮传值:

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {   

 StudioTemplateCell *cell = [tableView dequeueReusableCellWithIdentifier:@"StudioTemplateCellID"]; 

   [cell.editButton addTarget:selfaction:@selector(editClick:) forControlEvents:UIControlEventTouchUpInside];    objc_setAssociatedObject(cell.editButton,@"indexPathKey", indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

returncell;}

- (void)editClick:(UIButton*)btn{NSIndexPath*index = objc_getAssociatedObject(btn,@"indexPathKey");NSLog(@"%@", index);}

上一篇下一篇

猜你喜欢

热点阅读