【iOS知識匯】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);

}

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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM