runtime 关联对象的使用

example

static NSString *key;
static NSString *blockKey;
static NSString *clickkey;

- (void)viewDidLoad {
    [super viewDidLoad];
    [self showDetailText];
    [self addClass];
    [self initUI];

    void(^action)(void)=^(){
        NSLog(@"block");
    };
    [self setTapActionWithBlock:action];

}
//关联对象
-(void)setTapActionWithBlock:(void(^)(void))block{
    //获取关联对象
    UITapGestureRecognizer *gesture=objc_getAssociatedObject(self, &key);

    if (!gesture) {
        gesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handActionForTapGesture:)];
        [self.view addGestureRecognizer:gesture];
        //设置手势关联对象
        objc_setAssociatedObject(self, &key, gesture,OBJC_ASSOCIATION_RETAIN);

    }
    //设置相应手势关联对象
    objc_setAssociatedObject(self, &blockKey, block, OBJC_ASSOCIATION_COPY);

}

//响应手势
-(void)handActionForTapGesture:(UIGestureRecognizer *)gesture{
    //获取关联对象,并从中取出block
    void(^action)(void)=objc_getAssociatedObject(self, &blockKey);

    if (action) {
        //执行block
        action();
    }

//    
//    if (gesture.state==UIGestureRecognizerStateBegan) {
//        
//        //获取关联对象,并从中取出block
//        void(^action)(void)=objc_getAssociatedObject(self, &blockKey);
//        
//        if (action) {
//            //执行block
//            action();
//        }
//    }
}


-(void)initUI{

    UIButton *click=[[UIButton alloc]initWithFrame:CGRectMake(0, 64, 200, 200)];
    click.backgroundColor=[UIColor orangeColor];
    [click setTitle:@"关联对象" forState:UIControlStateNormal];
    [click addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
    //设置关联对象
    objc_setAssociatedObject(self, &clickkey, @"hello", OBJC_ASSOCIATION_RETAIN);
    [self.view addSubview:click];

}

-(void)click:(UIButton *)btn{
    //获取关联对象
    NSString *str=objc_getAssociatedObject(self, &clickkey);
    NSLog(@"关联对象的值是%@",str);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值