前言:

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

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

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

ButtonDelegate.h

 #import <Foundation/Foundation.h>

 @protocol ButtonDelegate <NSObject>

 @required

 /**
* 不含参数的事件监听方法
*/
-(void)delegateFunction; @end

ButtonDelegateWithParameter.h

 #import <Foundation/Foundation.h>

 @protocol ButtonDelegateWithParameter <NSObject>

 /**
* 含参数的事件监听方法
*/
-(void)delegateFunctionWithParameter:(id)parameter; @end

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

HQButton.h

 #import <UIKit/UIKit.h>
#import "ButtonDelegate.h"
#import "ButtonDelegateWithParameter.h" @interface HQButton : UIButton /** 代理 */
@property (nonatomic,weak)id<ButtonDelegate> delegate; /** 含参数代理 */
@property (nonatomic,weak)id<ButtonDelegateWithParameter> delegateWithParamater; @end

HQButton.m

 #import "HQButton.h"

 @implementation HQButton

 /**
* 懒加载的使用,在需要监听代理的时候,所以只需要重写set方法,然后在set方法中实现加载delegate
* 亮点:就是重写set方法内部实现addTarget方法,监听self的func,然后在func内部调用delegate的实现协议的方法
* @return void
*/
-(void)setDelegate:(id<ButtonDelegate>)delegate
{
[self addTarget:self action:@selector(func) forControlEvents:UIControlEventTouchUpInside];
_delegate = delegate; }
-(void)setDelegateWithParamater:(id<ButtonDelegateWithParameter>)delegateWithParamater{
[self addTarget:self action:@selector(funcWithParameter:) forControlEvents:UIControlEventTouchUpInside];
_delegateWithParamater = delegateWithParamater;
} -(void)func
{
[self.delegate delegateFunction];
}
-(void)funcWithParameter:(id)parameter
{
[self.delegateWithParamater delegateFunctionWithParameter:parameter];
}
@end

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

 #import "ViewController.h"
#import "HQButton.h" @interface ViewController ()<ButtonDelegate,ButtonDelegateWithParameter> @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //============创建自定义按钮================
HQButton* button = [[HQButton alloc] init]; //添加含参数的代理
button.delegateWithParamater = self;
//设置按钮的位置,背景颜色,显示文字
button.frame = CGRectMake(, , , );
button.backgroundColor = [UIColor redColor]; //=============为按钮添加代理==============
//添加不含参数的代理
button.delegate = self;

//父控件添加这个按钮
[self.view addSubview:button]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; }
//=============实现协议里的方法==============
-(void)delegateFunction{
NSLog(@"Hello");
} -(void)delegateFunctionWithParameter:(id)parameter{
NSLog(@"self: %@",parameter);
} @end

源代码百度云下载链接: http://pan.baidu.com/s/1mgIpuPy 密码: 89ww

 
 
 
 
 

IOS之UI--自定义按钮实现代理监听点击事件的更多相关文章

  1. Android监听点击事件实现的三种方法

    监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Con ...

  2. swift项目第六天:中间发布按钮的封装以及监听点击事件

    import UIKit /* 总结:1:给UIButton写分类,新建文件swiftFile,一般为了区分起名字都是名字-Extension,要想调用UI控件需要导入 import UIKit框架, ...

  3. iOS微信浏览器回退不刷新(监听浏览器回退事件)

    兼容性:兼容全部ios系统 $(function(){ pushHistory(); }); function pushHistory(){ window.addEventListener(" ...

  4. recyclerview 主活动里监听点击事件

    记性真的不行啊...贴上来有时间多复习复习 主活动 package com.example.com.webtext; import android.content.Intent; import and ...

  5. [Android]Fragment自定义动画、动画监听以及兼容性包使用

    Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能 ...

  6. 三种方式监听NGUI的事件方法

    NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定 ...

  7. iOS开发小技巧 - label中的文字添加点击事件

    Label中的文字添加点击事件 GitHub地址:https://github.com/lyb5834/YBAttributeTextTapAction 以前老师讲过类似的功能,自己懒得回头看了,找了 ...

  8. javascript 原生方法监听DOM结构改变事件

    js原生方法监听DOM结构改变事件 document.addEventListener('DOMNodeInserted',function(){alert(1)},false);document.a ...

  9. WPF之监听组合键事件

    private void KeyDown(object sender, KeyEventArgs e) { if (e.Key== Key.Up && Keyboard.Modifie ...

随机推荐

  1. java简单统计.java文件中的有效代码行,空行,注释行

    package regxdemo; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundExc ...

  2. Java异步回调

      作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 1.开始讲故事: 午饭的时候到了,可是天气太冷,根本不想出办公室的门,于是你拨通了某饭店的订餐电话“喂!你好 ...

  3. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  4. 当我们安装使用时,会出现eclipse启动不了,出现“Java was started but returned exit code=13......”的问题

    安装win8.1后,启动eclipse,也会提示 "java was started but returned exit code=13" 可能是eclipse.ini配置文件错误 ...

  5. Mybatis 中在传参时,${} 和#{} 的区别

    介绍 MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型. 在SQL中引用这些参数 ...

  6. Event事件跨浏览器封装

    var Event = { //注册事件 addEvent: function(element,type,handler){ if(element.addEventListener){ //DOM2级 ...

  7. sql分页存储过程

    ALTER PROCEDURE [dbo].[P_SplitPagesQuery] @TablesName NVARCHAR(MAX),--表名或视图名(只能传单一表名) @PK NVARCHAR(M ...

  8. 怎样从C#中打开数据库并进行 增 删 改 查 操作

    首先 在C#中引用数据库的操作! (因为我们用的是SQLserver数据库,所以是SqlClient) using System.Data.SqlClient; 1:要实现对数据库的操作,我们必须先登 ...

  9. 关于WPF绘图中的path.data在后台重新赋值的语法

    //XAML语法 <Path Name="path_M" Fill="LawnGreen" Data="M 0 0 L 100 0 L 100 ...

  10. asp.net.mvc 的单文件上传和多文件上传的简单例子

    首先打开vs2012,创建空的mvc4项目,名称为MVCStudy,选择基本模板