欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

IOS setOnclick点击事件分析

程序员文章站 2023-12-14 13:58:40
在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的就略过了,原理是一样的,代码也是非常简单。

总结

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

上一篇:

下一篇: