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


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

       

  • 相关阅读:
    Windows下查看dll被哪个进程调用
    mfc笔记之string,wstring,CString
    查看用户主目录
    我看Windows 8 RT
    C# 性能优化之斤斤计较篇 一
    曾经生活过的城市
    大型.NET项目的目录、编译和版本管理实践 四
    大型.NET项目的目录、编译和版本管理实践 五
    大型.NET项目的目录、编译和版本管理实践 二
    大型.NET项目的目录、编译和版本管理实践 一
  • 原文地址:https://www.cnblogs.com/yulongjiayuan/p/6588914.html
Copyright © 2020-2023  润新知