1. 程式人生 > >iOS UIButton點選事件傳遞引數的解決辦法

iOS UIButton點選事件傳遞引數的解決辦法

一、問題的出現

原生的UIButton的點選事件唯一的引數就是UIButton本身,我們通常使用UIButton自帶的tag來使用不同的引數,在簡單的業務場景下,通過tag都是可以滿足需求的,但是在某些業務複雜的情況下,tag顯得有些無力了,畢竟通過tag來傳遞點選事件傳遞引數只是一種間接的方式,並沒有將資料來源繫結到控制元件上。例如table檢視有多個section,cell上有多個btn,那麼btn的點選事件要如何獲取到對應的資料呢?其實通過tag是可以的,但是會變得有些複雜。

那麼為何不通過直接關聯來獲取資料呢?下面分別介紹btn的傳遞引數的解決辦法。

二、傳遞引數

1)、間接獲取資料

a、通過btn的tag(適用於大部分業務)

// 設定tag
btn.tag = indexPath.row;
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
// 通過tag獲取資料
-(void)btnAction:(UIButton *)btn{
    NSLog(@"%@",self.data[btn.tag]);
}

b、通過btn的父檢視

這種方式需要將資料來源繫結到父檢視上,當點選btn時,通過父檢視來獲取資料
業務應用:一個cell上有多個按鈕,共用cell的資料時

2)、直接獲取資料(關聯繫結)

a、自定義btn(繼承),新增屬性

直接給btn新增一個屬性作為引數,如字典

@interface MyButton : UIButton
@property (strong ,nonatomic) NSDictionary *paramDic; // 用來傳遞引數
@end
// 直接賦值
btn.paramDic = @{@"name":@"LOLITA",@"age":@"24"};
-(void)btnAction:(MyButton *)btn{
    NSLog(@"%@",btn.paramDic);
}

b、類別/分類,新增屬性

如果你不想通過自定義btn的方式來傳遞引數,你可以通過分類來為你的UIButton來新增一個屬性

步驟一、新建UIButton分類,新增一個屬性

@interface UIButton (PassValue)
@property (strong ,nonatomic) NSDictionary *paramDic;
@end

步驟二、實現setter、getter方法

-(NSDictionary *)paramDic{
    return objc_getAssociatedObject(self, _cmd);
}
-(void)setParamDic:(NSDictionary *)paramDic{
    objc_setAssociatedObject(self, @selector(paramDic), paramDic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

步驟三、匯入檔案,使用btn新增的屬性

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
btn.paramDic = @{@"name":@"LOLITA",@"age":@"24"};
-(void)btnAction:(MyButton *)btn{
    NSLog(@"%@",btn.paramDic); 
}

c、動態執行時繫結資料

在上一個辦法中,我們已經使用了動態執行時實現了btn的setter和getter方法來為分類新增屬性了,那麼,如果你也不想新建btn的分類檔案,你可以直接使用執行時繫結資料

// 繫結資料來源
objc_setAssociatedObject(btn, @"myBtn", dataDic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-(void)yanbaoClick:(UIButton *)sender{
    // 獲取資料來源
    NSDictionary *dic = objc_getAssociatedObject(sender, @"myBtn");
    NSLog(@"%@",dic);
}