一般UIButton点击之后相应一个对应的函数,而在传参的过程中,使用这个函数传的也是一个参数

-(void)dismissPopupViewWithTarget:(UIButton*)sender
{
//    function1
//    function2
}

但是这个sender除了传了一个sender.tag值,好像没有什么其他用处了,然后在该函数中响应function1function2这两个自己对象的函数。现在如果想在这个点击的时候除了响应自己的函数外,还想响应另外可变对象的函数应该怎么实现呢。
当然我说的不是new出一个新对象,然后再调用这种基础使用,我说的是比如一个提醒框,同一个提醒框在不同界面弹出的时候响应的是不同的对象的函数。

解决方案

使用runtime的方案解决

#import "objc/runtime.h"

///错误提醒框
-(void)showErrorPopupView:(NSString*)subText withTarget:(id)target action:(NSString*)action
{
       
    UIButton *button = [[UIButton alloc] init];
    UIImage *img = [UIImage imageNamed:@"btn_big"];
    img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(0, 25, 0, 25) resizingMode:UIImageResizingModeStretch];
    [button setBackgroundImage:img forState:UIControlStateNormal];
    [button setTitle:@"重试" forState:UIControlStateNormal];
    [view addSubview:button];

    objc_setAssociatedObject(button, "firstObject", target, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    objc_setAssociatedObject(button, "secondObject", action, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    [button addTarget:self action:@selector(dismissPopupViewWithTarget:) forControlEvents:UIControlEventTouchUpInside];
    
    
    
    [button mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(titleLabel.mas_bottom).with.offset(52*kJLXHeightScale);
        make.centerX.equalTo(view);
        make.width.mas_equalTo(360*kJLXWidthScale);
    }];
}

在响应的函数中截取传输的内容,如果是获取传输的内容的话,则直接取值即可,现在是传递的函数,所以第一个是传递的对象,第二个是那个对象的函数,这样在点击的时候就可以达到除了响应自己的dismissPopupView的函数,还可以响应传进来的对象响应对应的函数。

-(void)dismissPopupViewWithTarget:(UIButton*)sender
{
    id first = objc_getAssociatedObject(sender, "firstObject");
    id second = objc_getAssociatedObject(sender, "secondObject");
    SEL sel = NSSelectorFromString (second);
    if ([first respondsToSelector: sel])
    {
        [first performSelector: sel withObject:nil];
    }
    [self dismissPopupView];
}

使用
在其他的对象里面调用

[[JLXPopupView sharedJLXPopupView] showErrorPopupView:[NSString stringWithFormat:@"提交出现错误,请重新提交%@",[responseObject objectForKey:@"msg"]] withTarget:weakSelf action:@"backToVC"];

这样在点击的时候,就会响应自己的backToVC的函数,也会响应JLXPopupView的dismissPopupView的函数。传值也一样。


☟☟可点击下方广告支持一下☟☟

最后修改:2017 年 04 月 08 日
请我喝杯可乐,请随意打赏: ☞已打赏列表