IOS之UI--自定义按钮实现代理监听点击事件

简介:

前言:

Objective-C提供的按钮监听事件的方法是
    不含参数的监听方法
    [button实例对象 addTarget:self action:@selector(func) forControlEvents:UIControlEventTouchUpInside];
    含参数的监听方法
    [button实例对象 addTarget:self action:@selector(func:) forControlEvents:UIControlEventTouchUpInside];
下面通过代理的方式,将这两个监听事件的方法在自定义UIButton中封装起来,然后使用的时候,就类似Java的事件监听。

自定义按钮实现代理监听点击事件

因为有两种不同的监听方法,一个不含参数,一个含参数,所以最好用两个代理协议来处理,一个协议一个行为业务方法:

ButtonDelegate.h

复制代码
 1 #import <Foundation/Foundation.h>
 2 
 3 @protocol ButtonDelegate <NSObject>
 4 
 5 @required
 6 
 7 /**
 8  *  不含参数的事件监听方法
 9  */
10 -(void)delegateFunction;
11 
12 
13 @end
复制代码

ButtonDelegateWithParameter.h

复制代码
 1 #import <Foundation/Foundation.h>
 2 
 3 @protocol ButtonDelegateWithParameter <NSObject>
 4 
 5 
 6 /**
 7  *  含参数的事件监听方法
 8  */
 9 -(void)delegateFunctionWithParameter:(id)parameter;
10 
11 @end
复制代码

然后自定义UIbutton,并在自定义UIbutton中组合两个对应的代理delegate的引用。

HQButton.h

复制代码
 1 #import <UIKit/UIKit.h>
 2 #import "ButtonDelegate.h"
 3 #import "ButtonDelegateWithParameter.h"
 4 
 5 @interface HQButton : UIButton
 6 
 7 /** 代理 */
 8 @property (nonatomic,weak)id<ButtonDelegate> delegate;
 9 
10 /** 含参数代理 */
11 @property (nonatomic,weak)id<ButtonDelegateWithParameter> delegateWithParamater;
12 
13 @end
复制代码

HQButton.m

复制代码
 1 #import "HQButton.h"
 2 
 3 @implementation HQButton
 4 
 5 /**
 6  *  懒加载的使用,在需要监听代理的时候,所以只需要重写set方法,然后在set方法中实现加载delegate
 7  *  亮点:就是重写set方法内部实现addTarget方法,监听self的func,然后在func内部调用delegate的实现协议的方法
 8  *  @return void
 9  */
10 -(void)setDelegate:(id<ButtonDelegate>)delegate
11 {
12     [self addTarget:self action:@selector(func) forControlEvents:UIControlEventTouchUpInside];
13     _delegate = delegate;
14     
15 }
16 -(void)setDelegateWithParamater:(id<ButtonDelegateWithParameter>)delegateWithParamater{
17     [self addTarget:self action:@selector(funcWithParameter:) forControlEvents:UIControlEventTouchUpInside];
18     _delegateWithParamater = delegateWithParamater;
19 }
20 
21 -(void)func
22 {
23     [self.delegate delegateFunction];
24 }
25 -(void)funcWithParameter:(id)parameter
26 {
27     [self.delegateWithParamater delegateFunctionWithParameter:parameter];
28 }
29 @end
复制代码

在ViewController中实现相关的协议,然后使用这个自定义button然后添加delegate。

复制代码
 1 #import "ViewController.h"
 2 #import "HQButton.h"
 3 
 4 @interface ViewController ()<ButtonDelegate,ButtonDelegateWithParameter>
 5 
 6 @end
 7 
 8 @implementation ViewController
 9 
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12     
13     //============创建自定义按钮================
14     HQButton* button = [[HQButton alloc] init];
15     
16     //添加含参数的代理
17     button.delegateWithParamater = self;
18     //设置按钮的位置,背景颜色,显示文字
19     button.frame = CGRectMake(100, 100, 200, 100);
20     button.backgroundColor = [UIColor redColor];
21     
22     //=============为按钮添加代理==============
23     //添加不含参数的代理
24     button.delegate = self;
25 
26     //父控件添加这个按钮
27     [self.view addSubview:button];
28     
29 }
30 
31 - (void)didReceiveMemoryWarning {
32     [super didReceiveMemoryWarning];
33     
34 }
35 //=============实现协议里的方法==============
36 -(void)delegateFunction{
37     NSLog(@"Hello");
38 }
39 
40 -(void)delegateFunctionWithParameter:(id)parameter{
41     NSLog(@"self: %@",parameter);
42 }
43 
44 @end
复制代码

相关文章
|
2月前
|
iOS开发 UED
实现一个自定义的iOS动画效果
【4月更文挑战第9天】本文将详细介绍如何在iOS平台上实现一个自定义的动画效果。我们将通过使用Core Animation框架来实现这个动画效果,并展示如何在不同的场景中使用它。文章的目标是帮助读者理解如何使用Core Animation框架来创建自定义动画,并提供一个简单的示例代码。
29 1
|
23天前
|
JavaScript
vue + element UI 表单中内嵌自定义组件的表单校验触发方案
vue + element UI 表单中内嵌自定义组件的表单校验触发方案
27 5
|
1月前
|
XML IDE 开发工具
【Android UI】自定义带按钮的标题栏
【Android UI】自定义带按钮的标题栏
36 7
【Android UI】自定义带按钮的标题栏
|
24天前
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
23 1
|
25天前
Element UI 源码改造 —— 自定义数字输入框的实现
Element UI 源码改造 —— 自定义数字输入框的实现
12 1
|
25天前
|
容器
Element UI 自定义环形进度条里的内容
Element UI 自定义环形进度条里的内容
20 2
|
22天前
|
数据安全/隐私保护
Element UI 密码输入框--可切换显示隐藏,自定义图标
Element UI 密码输入框--可切换显示隐藏,自定义图标
16 0
|
22天前
Element UI 【表格合计】el-table 实战范例 -- 添加单位,自定义计算逻辑
Element UI 【表格合计】el-table 实战范例 -- 添加单位,自定义计算逻辑
18 0
|
25天前
【亲测有效】Element UI 自定义 Notification 通知样式不生效,设置this.$notify样式不生效问题
【亲测有效】Element UI 自定义 Notification 通知样式不生效,设置this.$notify样式不生效问题
12 0