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

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

时间: 2024-10-14 03:01:23

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

CCLayer 监听点击事件

根据CCLayer 的源代码,若touchEnable为true, 在onEnter(),onExit()分别会注册监听及解除监听,这样一样就不会自己写监听.需要注意的是默认监听多点触摸,即不会调用 virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 另外CCLayer提供了一个setTouchMode(ccTouchesMode mode) 来设定监听点击的类型,typedef enum { kCCTouchesAllAtO

cocos2d-x CCSprite 精灵监听点击事件

参考文章: cocos2d-x 精灵监听点击事件 http://labs.easymobi.cn/?p=5167 实现过程,实现CCTouchDelegate接口,在enter 的时候添加监听,exit 和析构时移除监听,点击时将touch 的坐标转化为相对精灵的坐标,如果是否在精灵的范围内,则响应点击.主要是参考前面两篇文章中的例子,不同的地方在判断区域,个人觉得太复杂.所以稍微修改了下,看起来更容易理解. PianoTile.h class PianoTile : public cocos2

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

监听点击事件实现的三种方法:1.匿名内部类2.外部类3.直接实现接口 1.匿名内部类: package com.jereh.calculator; import android.content.Context; import android.os.Bundle; import android.os.PersistableBundle; import android.support.design.widget.FloatingActionButton; import android.support

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

import UIKit /* 总结:1:给UIButton写分类,新建文件swiftFile,一般为了区分起名字都是名字-Extension,要想调用UI控件需要导入 import UIKit框架,然后给系统的类写分类:extension UIButton {},提供类方法或是构造函数的方法,把与该控件有关的业务逻辑全封装在分类的内部.2:封装方法:类方法:都是以class开头,class func 函数名(参数)->返回值类型{业务逻辑代码,return 返回值}:例子: class fun

iOS7_ios7_如何实现UIAlertView以及监听点击事件(其它样式)_如何修改UITextField默认键盘样式

首先我们知道,UIAlertView实际上有多种样式,在xcode中,按住cmd点击UIAlertView,进入头文件我们看到: 1 typedef NS_ENUM(NSInteger, UIAlertViewStyle) { 2 UIAlertViewStyleDefault = 0, //默认样式 3 UIAlertViewStyleSecureTextInput, //加密文本样式 4 UIAlertViewStylePlainTextInput, //普通文本样式 5 UIAlertVi

ios7_如何实现UIAlertView以及监听点击事件

1.在viewController的.m文件,遵守<UIAlertViewDelegate>代理协议 @interface moboViewController () <UIAlertViewDelegate> 2.在 - (void)viewDidLoad 方法中实现UIAlertView 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 // 1.初始化 alertView 6 UIAlertView *altView =

Button监听点击事件的五种方式

常用方式为匿名类和本类监听的方法.其中本类监听方法需要继承View.OnClickListener接口之后,重写onClick方法. PS:重写某一个方法的快捷键为Ctrl+O package com.example.kimberjin.reviewpro;  import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity;

ios 下fixed遮罩背景无法动态监听,解决办法

场景:当要弹出一个fixed的对话框(就是一个弹出框),同时给背景添加一个遮罩层,当操作完后想点击遮罩层关闭整个弹出框条件1:fixed的遮罩层是动态创建的,使用click事件监听不到条件2:在遮罩的下面有链接或是不能点击的元素(或有操作或有链接跳转等) 针对条件1,使用jQuery的on来监听整个文档,当冒泡到指定元素上时,再执行相应操作 针对条件2,使用touchstart/touchend,会产生点透问题 我的经验以及解决办法: 1.使用jQuery的delegate方法监听click事件

Android监听连续点击次数代码实现

一般实现 我们知道,一般实现双击事件,可以通过new OnClickListener()监听点击事件,然后记录前后两次点击距离开机的时间,由时间差在一定范围实现,代码如下: long firstClickTime = 0; @Override public void onClick(View view) { if(firstClickTime > 0){ long secondClickTime = SystemClock.uptimeMillis();//距离上次开机时间 long dtime