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

时间: 2024-10-28 23:09:30

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

jquery-ui-draggable-事件捕获对一个元素监听拖动事件并对这个元素的子元素监听点击事件

问题描述 事件捕获对一个元素监听拖动事件并对这个元素的子元素监听点击事件 在不支持事件冒泡的浏览器中.对一个元素监听拖动事件并对这个元素的子元素监听点击事件.这两个事件会冲突.只能执行拖动事件.这种问题怎么解决? 解决方案 Preference元素和监听事件 解决方案二: 说明你没点击到子元素,一般是从子元素冒泡,不支持冒泡不会触发父元素的拖动事件 不过有哪种浏览器不支持冒泡?还没碰到过.. 解决方案三: 浏览器都支持冒泡啊,如果你只用捕获,那么肯定是先监听到父元素的事件,再是子元素,但问题是你

removeView之后,listView无法监听点击事件

问题描述 removeView之后,listView无法监听点击事件 解决方案 remove了,在屏幕上都看不见了,当然不会再去响应点击事件了.

listview-android-怎么在一个ListView中监听点击事件?

问题描述 android-怎么在一个ListView中监听点击事件? 我现在有这个代码 ListView list = (ListView)findViewById(R.id.ListView01); ... list.setAdapter(adapter); 当我像下边这么做的时候 list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(Adapte

IOS 开发之自定义按钮实现文字图片位置随意定制_IOS

IOS 开发之自定义按钮实现文字图片位置随意定制 可能有些看到这篇文章的朋友会觉得很不屑:"按钮谁不会自定义?还需要看你的?" 也确实,按钮是我们项目中最常见的控件之一,天天在使用.对于不同类型的按钮,我们是否有更加简便的方法来实现需求是我们需要做的.这里我提出自己的两种方法,您可以对你自己平时自定义按钮的方法做一下对比,看看哪种方法更加简单. 多说一句,千万不要觉得知识简单,觉得自己会了,没必要学习.'往往简单的东西存在大智慧'(这个比给满分),知识都是慢慢积累出来的. 按钮是应用中

button-多个按钮和OnClickListeners监听事件处理

问题描述 多个按钮和OnClickListeners监听事件处理 在我的 XML布局文件中有16个按钮(数字,加号,减号等).我想知道如何检查哪个按钮被按下?我的想法是每个按钮都使用onClick()方法.但是这个方法有点不切实际,因为有16个按钮呢.我在网上搜索说可以在布局xml中使用android:onClick=""function"" 的参数.我不会在程序中运用,请问大家谁知道怎么处理多个按钮和OnClickListeners监听事件呢? 解决方案 声明:

ase ctivity-BaseActivity下自定义actionbar中的button设置点击事件无效,代码见下。

问题描述 BaseActivity下自定义actionbar中的button设置点击事件无效,代码见下. package com.lyri.main.base; import com.example.LlsqPs.R; import android.app.ActionBar;import android.app.Activity;import android.app.ActionBar.LayoutParams;import android.content.Context;import and

android如何监听点击的是哪个快捷方式

问题描述 android如何监听点击的是哪个快捷方式 android 如何监听点击的是哪个快捷方式,我现在要创建一个空的快捷方式,然后在点击的时候开启一个服务,求帮忙 解决方案 Android 四种点击监听方式Android 快捷方式android studio 快捷方式 解决方案二: 你问题表达的不够清楚 解决方案三: 你问的是什么哦!是添加快速监听器的方快捷键吗?android studio

js监听滚动条滚动事件使得某个标签内容始终位于同一位置

 js如何监听滚动条滚动事件,使得某个标签内容始终位于同一位置,下面有个不错的示例,大家可以参考下 小知识点,废话不多说,直接上代码    css:   代码如下: <pre name="code" class="css"><style>  #anchor:{  position:absulate;  top:40%;  left:40%;  width:100px;  height:100px;  background-color:red;

在flex中监听鼠标右键事件,提示 TypeError Error 2007 参数type不能为空。

在flex中监听鼠标右键事件 ,报错,提示 缺少参数. TypeError: Error 2007: 参数 type 不能为空. at flash.events::EventDispatcher/addEventListener() at com.waylau.eagleos.components::DesktopExplorer/service_resultHandler()[D:\workspaceFB47\com.waylau.eagleos_0.9.5\src\com\waylau\ea