如何不自定义按钮又想给按钮传递参数?---利用运行时给按钮做关联!
我们项目中经常会遇到多个按钮共用了一个点击方法,然后需要给每个按钮传递不同的参数,. 我们比较容易想到的方法也许是把参数装在一个数组里面,然后给按钮设置tag,然后通过tag从数组里面取出对应的值.或者你会自定义按钮,给按钮添加属性,来完成需求. 但我今天呢,要利用runtime的关联来完成传参操作;
一言不合就上代码:
#import "ViewController.h" #import <objc/runtime.h> static NSString const* btnKey = @"btnKey"; @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; /* objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。 1、源对象alert 2、关键字 唯一静态变量key associatedkey 3、关联的对象 sender 4、关键策略 OBJC_ASSOCIATION_RETAIN_NONATOMIC */ NSString *str = @"字符串"; NSDictionary *dic = @{@"key":@"anwser",@"key2":@"anwser2"}; NSArray *nums = @[@1,@2,@3]; NSMutableArray *arr = [NSMutableArray array]; [arr addObject:str]; [arr addObject:dic]; [arr addObject:nums]; for (int i = 0; i < arr.count; i++) { UIButton *btn = [UIButton new]; btn.backgroundColor = [UIColor blueColor]; [btn setTitle:@"按钮" forState:UIControlStateNormal]; btn.frame = CGRectMake(100, (i + 1)*100, 50, 50); [self.view addSubview:btn]; [btn addTarget:self action:@selector(tap:) forControlEvents:UIControlEventTouchUpInside]; //关联 objc_setAssociatedObject(btn, &btnKey, arr[i], OBJC_ASSOCIATION_RETAIN_NONATOMIC); } } - (void)tap:(UIButton *)btn{ id obj = objc_getAssociatedObject(btn, &btnKey); NSLog(@"%@----%@",obj,[obj class]); /*打印: 2017-03-20 12:08:42.718 test_select[98612:15827311] 字符串----__NSCFConstantString 2017-03-20 12:08:43.533 test_select[98612:15827311] { key = anwser; key2 = anwser2; }----__NSDictionaryI 2017-03-20 12:08:44.396 test_select[98612:15827311] ( 1, 2, 3 )----__NSArrayI */ } @end
有没有觉得很方便呢,参数是id可以传任何类型的值哦, 如果要断开关联使用objc_setAssociatedObject函数,传入nil值即可
比如上面的按钮
objc_setAssociatedObject(btn, &btnKey, nil, OBJC_ASSOCIATION_ASSIGN);