iOS UIButton 点击事件带多参数

iOS原生的 UIButton 点击事件是不允许带多参数的,唯一的一个参数就是默认UIButton本身

那么我们该怎么实现传递多个参数的点击事件呢?

1.如果业务场景非常简单,要求传单参数并且是整数类型,可以用tag

[cell.deleteButtonsetTag:indexPath.row];//例如,将cell的行数设置成tag

2.利用ObjC关联,runtime之所以被称为iOS 的动态特性是有道理的,当然关联甚至可以帮助NSArray等其他对象实现“多参数传递”

实现起来也非常简便:

UIButton*btn =// create the button

objc_setAssociatedObject(btn,"firstObject", someObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);//实际上就是KVC

objc_setAssociatedObject(btn,"secondObject", otherObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

[btnaddTarget:selfaction:@selector(click:)forControlEvents:UIControlEventTouchUpInside];

- (void)click:(UIButton*)sender

{

idfirst = objc_getAssociatedObject(btn,"firstObject");//取参

idsecond = objc_setAssociatedObject(btn,"secondObject");

// etc.

}

3.利用自定义,添加一个多参数的字典属性变量即可(为什么要字典?可以装多多的)

自定义Button子类,甚至都不用重写啥的:

@interfaceMultiParamButton : UIButton

@property(nonatomic,strong) NSDictionary* multiParamDic;

@end

传参:

NSDictionary* paramDic = @{@"one":@"one",@"two":@2,@"third":@(3)};

MultiParamButton* multiParamButton = [[MultiParamButtonalloc]init];

[multiParamButtonsetFrame:CGRectMake(0,0,50,50)];

multiParamButton.center=self.view.center;

[multiParamButtonsetBackgroundColor:[UIColorgrayColor]];

[multiParamButtonaddTarget:selfaction:@selector(multiParamButtonClicked:)forControlEvents:UIControlEventTouchUpInside];

[self.viewaddSubview:multiParamButton];

multiParamButton.multiParamDic= paramDic;

点击:

- (void)multiParamButtonClicked:(UIButton* )button

{

MultiParamButton* multiParamButton = (MultiParamButton* )button;

NSLog(@"Vvvverify : %@", multiParamButton.multiParamDic);

}

当然,如果用扩展,然后添加property后重写GetSet也是一样一样的

4.完全不在Button上入手,针对业务来,最常见的就是在TableViewCell上面的Button,这种存在(视图)继承树之间的传递,这里举个简单的例子

Button获取所属父视图的所属视图控制器的参数,间接传参

#import "LBMultiParamButtonController.h"

#import "MultiParamButton.h"

@interfaceLBMultiParamButtonController ()

@property(nonatomic,strong) NSDictionary* paramDic;

@end

@implementationLBMultiParamButtonController

- (id)init

{

self= [superinit];

if(self)

{

_paramDic = @{@"one":@"one",@"two":@2,@"third":@(3)};

}

returnself;

}

- (void)viewDidLoad

{

[superviewDidLoad];

UIButton* button = [UIButtonbuttonWithType:UIButtonTypeCustom];

[buttonsetFrame:CGRectMake(0,0,50,50)];

[buttonsetCenter:self.view.center];

[buttonsetBackgroundColor:[UIColorgrayColor]];

[buttonaddTarget:selfaction:@selector(buttonClicked:)forControlEvents:UIControlEventTouchUpInside];

[self.viewaddSubview:button];

}

- (void)buttonClicked:(UIButton* )button

{

LBMultiParamButtonController* multiParamButtonController =nil;

//获取button所属的视图控制器,如果视图控制器都能获取,还有什么不能获取呢?

for(UIView* next = [buttonsuperview]; next; next = next.superview)

{

UIResponder*nextResponder = [nextnextResponder];

if([nextResponderisKindOfClass:[LBMultiParamButtonControllerclass]])

{

multiParamButtonController = (LBMultiParamButtonController* )nextResponder;

break;

}

}

NSLog(@"param : %@", multiParamButtonController.paramDic);

}

@end

这种非常多的用在UITableViewCell上自定义的按钮的参数的情况!

5.利用Delegate和performSelector:withObject:withObject  方法可以传递最多两个参数:

定义protocol:

#pragma mark - SYAccountListCellDelegate.

@classSYAccountListCell;

@protocolSYAccountListCellDelegate 

- (void)accountListCell:(SYAccountListCell* )celldidTapButton:(UIButton* )button;

@end

自定义Cell的时候将你想传的东西传进入,这里用cell和button做例子:

@implementationSYAccountListCell

- (id)initWithStyle:(UITableViewCellStyle)stylereuseIdentifier:(NSString*)reuseIdentifier

{

self= [superinitWithStyle:stylereuseIdentifier:reuseIdentifier];

if(self)

{

self.deleteButton= [UIButtonbuttonWithType:UIButtonTypeCustom];

[self.deleteButtonsetFrame:CGRectMake(225,

5,

40,

40)];

[self.deleteButtonsetBackgroundColor:[UIColorredColor]];

[self.deleteButtonaddTarget:selfaction:@selector(deleteButtonClicked:)forControlEvents:UIControlEventTouchUpInside];

[self.contentViewaddSubview:self.deleteButton];

}

returnself;

}

- (void)deleteButtonClicked:(UIButton* )button

{

if([self.delegaterespondsToSelector:@selector(accountListCell:didTapButton:)])

{

[self.delegateperformSelector:@selector(accountListCell:didTapButton:)withObject:selfwithObject:button];

}

}

@end

Delegate实现:

#pragma mark - SYAccountListCellDelegate.

- (void)accountListCell:(SYAccountListCell*)celldidTapButton:(UIButton*)button

{

NSLog(@"Cell : %@ , Button : %@", cell, button);

}

虽然有点曲折,但是传参效果非常到位

这里补充一下,这里的最多两个参数是直面的参数个数,如果将参数设置位结构体,那么就皆大欢喜啦,想怎么传就怎么传!

6.利用Block 和  关联 , 直接可以当前点击并且操作参数 - 强!

#import 

typedefvoid(^ActionBlock)();

@interfaceUIButton (Utility)

@property(readonly)NSMutableDictionary*event;

- (void)handleControlEvent:(UIControlEvents)controlEventwithBlock:(ActionBlock)action;

@end

实现文件:

#import 

#import "UIButton+Utility.h"

@implementationUIButton (Utility)

staticcharoverviewKey;

@dynamicevent;

- (void)handleControlEvent:(UIControlEvents)eventwithBlock:(ActionBlock)block

{

objc_setAssociatedObject(self, &overviewKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);

[selfaddTarget:selfaction:@selector(callActionBlock:)forControlEvents:event];

}

- (void)callActionBlock:(id)sender

{

ActionBlock block = (ActionBlock)objc_getAssociatedObject(self, &overviewKey);

if(block)

{

block();

}

}

@end

操作:

[buttonhandleControlEvent:UIControlEventTouchUpInsidewithBlock:^{

NSLog(@"ssss : %@",self.paramDic);

}];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容