一、問題的出現
原生的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);
}
1
2
3
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"};
1
2
-(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);
}
作者:饅頭壓扁就是餅
鏈接:https://www.jianshu.com/p/eb80db70246d
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。