如何不自定义按钮又想给按钮传递参数?---利用运行时给按钮做关联!

 我们项目中经常会遇到多个按钮共用了一个点击方法,然后需要给每个按钮传递不同的参数,. 我们比较容易想到的方法也许是把参数装在一个数组里面,然后给按钮设置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);

   

posted @ 2017-03-20 14:45  御龙家园  阅读(366)  评论(0编辑  收藏  举报