IOS之UI--自定义按钮实现代理监听点击事件
前言:
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--自定义按钮实现代理监听点击事件的更多相关文章
- Android监听点击事件实现的三种方法
监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Con ...
- swift项目第六天:中间发布按钮的封装以及监听点击事件
import UIKit /* 总结:1:给UIButton写分类,新建文件swiftFile,一般为了区分起名字都是名字-Extension,要想调用UI控件需要导入 import UIKit框架, ...
- iOS微信浏览器回退不刷新(监听浏览器回退事件)
兼容性:兼容全部ios系统 $(function(){ pushHistory(); }); function pushHistory(){ window.addEventListener(" ...
- recyclerview 主活动里监听点击事件
记性真的不行啊...贴上来有时间多复习复习 主活动 package com.example.com.webtext; import android.content.Intent; import and ...
- [Android]Fragment自定义动画、动画监听以及兼容性包使用
Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能 ...
- 三种方式监听NGUI的事件方法
NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定 ...
- iOS开发小技巧 - label中的文字添加点击事件
Label中的文字添加点击事件 GitHub地址:https://github.com/lyb5834/YBAttributeTextTapAction 以前老师讲过类似的功能,自己懒得回头看了,找了 ...
- javascript 原生方法监听DOM结构改变事件
js原生方法监听DOM结构改变事件 document.addEventListener('DOMNodeInserted',function(){alert(1)},false);document.a ...
- WPF之监听组合键事件
private void KeyDown(object sender, KeyEventArgs e) { if (e.Key== Key.Up && Keyboard.Modifie ...
随机推荐
- 爬虫技术 -- 基础学习(一)HTML规范化(附特殊字符编码表)
最近在做网页信息提取这方面的,由于没接触过这系列的知识点,所以逛博客,看文档~~看着finallyly大神的博文和文档,边看边学习边总结~~ 对网站页面进行信息提取,需要进行页面解析,解析的方法有以下 ...
- android自定义之 5.0 风格progressBar
最近做项目,用到了ProgressBar ,就想到了要使用Android5.0 的效果,就随手实现了一下. 效果图: 大概的思路: 1. 圆圈通过Canvas去绘制 2.圆圈的动画通过Animator ...
- [转载]SharePoint 2013搜索爬外网配置
本文介绍SharePoint 2013 设置外网(Internet)爬网源: 下面是步聚: 1. 新建外部爬网源 a. 打开 “SharePoint 2013 Central Administrati ...
- 将win7电脑无线网变身WiFi热点,让手机、笔记本共享上网
开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买费.宏碁.惠普笔记本和诺基亚N97mini亲测通过. 以操 ...
- Mysql学习笔记(九)索引查询优化
PS:上网再次看了一下数据库关于索引的一些细节...感觉自己学的东西有点少...又再次的啃了啃索引.... 学习内容: 索引查询优化... 上一章说道的索引还不是特别的详细,再补充一些具体的细节... ...
- sql server 脚本创建数据库邮件
sql server 脚本创建数据库邮件代码: --脚本创建数据库邮件 --1.开启数据库邮件 RECONFIGURE WITH OVERRIDE GO RECONFIGURE WITH OVERRI ...
- mysql truncate带有被引用外键的表时报错解决方法
清空具有外键约束的表时报ERROR 1701(42000)的解决 mysql> truncate table t_users;ERROR 1701 (42000): Cannot trunc ...
- 使用HttpRequester模拟发送及接收Json请求
1.开发人员在火狐浏览器里经常使用的工具有Firebug,httprequester,restclient......火狐浏览器有一些强大的插件供开发人员使用!需要的可以在附加组件中扩展. 2.htt ...
- input placeholder属性IE、360浏览器兼容性问题
效果:http://hovertree.com/texiao/jquery/43/ 效果二:http://hovertree.com/texiao/jquery/43/1/ 请在IE中体验. 1.创建 ...
- 使用C#开发屏幕保护程序步骤
本文介绍使用C#制作屏幕保护的方法,这个屏幕保护就是仿效视窗系统自带的字幕屏保. 屏幕保护程序的扩展名虽然是"scr",但其实是一个可执行的"exe"文件.但他 ...