当前位置: 移动技术网 > 移动技术>移动开发>IOS > IOS setOnclick点击事件分析

IOS setOnclick点击事件分析

2019年07月24日  | 移动技术网移动技术  | 我要评论
在android中点击事件是以setonclick的形式进行设置的,用起来十分方便,而在ios中是以addtarget方式进行的,每次设置点击事件都需要声明一个新的方法,在

在android中点击事件是以setonclick的形式进行设置的,用起来十分方便,而在ios中是以addtarget方式进行的,每次设置点击事件都需要声明一个新的方法,在大部分情况下显得未免有些麻烦。而且通常来说我们使用的最多的是touchupinside方式的点击事件,所以为了方便使用,我对uibutton/uiview的点击事件进行了扩展。

使用

和之前一样,我们先来看看扩展之后如何使用

oc版本

[_btn1 setonclick:^{
  nslog(@"click btn1");
}];

swift版本

btn.setonclick {
  print("click btn")
}

用起来真的是非常简单哈~

扩展过程

接下来我们就来看看,到底是如何扩展的呢?

oc版本

我们只需要为uibutton添加一个category就可以使用了哦。

  #import <uikit/uikit.h>

  @interface uibutton(click)
  @property (nonatomic, strong) void (^clickblock) (void);
  - (void) setonclick : (void (^)(void))block;
  - (void) clickbtn : (uibutton*) sender;
  - (void) settarget : action:(sel)action;
  @end
  
  #import "uibutton+click.h"
  #import <objc/runtime.h>
  
  @implementation uibutton(click)
  
  static void *clickkey = &clickkey;
  - (void)setclickblock:(void (^)(void))clickblock{
    objc_setassociatedobject(self, & clickkey, clickblock, objc_association_copy);
  }
  
  - (void (^)(void))clickblock{
    return objc_getassociatedobject(self, &clickkey);
  }
  
  -(void)setonclick:(void (^)(void))block{
    self.clickblock = block;
    [self addtarget:self action:@selector(clickbtn:) forcontrolevents:uicontroleventtouchupinside];
  }
  
  - (void) clickbtn : (uibutton*) sender{
    self.clickblock();
  }
  
  @end

如果我们不希望每次都需要导入uibutton+click.h,只需要将uibutton+click.h添加到pch文件中就可以了哦。

swift版本

相对来说swift版本就比较麻烦一点,竟然不能直接扩展闭包类型的属性,所以最后多创建了一个uiclick对象。

  class uiclick : any{
    var click : () -> void = {return}
  }
  
  extension uibutton : property{
    var saveclick : uiclick{
      get{
        return get0()
      }
      set{
        return set0(newvalue)
      }
    }
    
    func setonclick(click : @escaping () -> void) {
      self.saveclick = uiclick()
      self.saveclick.click = click
      self.addtarget(self, action: #selector(btnclick), for: .touchupinside)
    }
    
    @objc func btnclick(){
      self.saveclick.click()
    }
  }

uiview onclick

看了以上的扩展过程,相信大家对uiview onclick的扩展心中也有数了,过程基本是一样的,接下来只简单写一下不同的部分。

  func setonclickview(click : @escaping () -> void) {
    self.isuserinteractionenabled = true
    self.saveclickview = uiclick()
    self.saveclickview.click = click
    let tap = uitapgesturerecognizer(target: self, action: #selector(btnclickview))
    tap.numberoftapsrequired = 1
    self.addgesturerecognizer(tap)
  }

oc的就略过了,原理是一样的,代码也是非常简单。

总结

扩展并不复杂,但是确实还是带来了不少方便,希望这种扩展思路能够让你眼前一亮,以上内容有任何错误欢迎指正。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网