iOS 自定义Cell按钮的点击代理事件

在实际开发工作中,我们经常会在自定义的Cell中布局一些按钮,并且很多时候我们会在点击这个按钮的时候使我们的UItableviewController跳转到下一界面,有的可能还要传值。那么如何使我们的控制器能够获知我们按下了cell的按钮呢?毫无疑问,这是个代理模式的典型应用场景。

首先我们先得定义一个cell。.h文件如下:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @protocol MycellDelegate <NSObject>  
  2.   
  3. @optional  
  4. -(void)didClickButton:(UIButton *)button;  
  5.   
  6. @end  
  7.   
  8. @interface Mycell : UITableViewCell  
  9.   
  10. +(instancetype)cellWithtableView:(UITableView *)tableview;  
  11.   
  12. @property(nonatomic,strong)DateModel *model;  
  13.   
  14. @property(nonatomic,weak) id<MycellDelegate> delegate;  

.m文件如下:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #import "Mycell.h"  
  2.   
  3. @interface Mycell()  
  4.   
  5. @property(nonatomic,strong)UIButton *button;  
  6.   
  7. @end  
  8.   
  9. @implementation Mycell  
  10.   
  11. +(instancetype)cellWithtableView:(UITableView *)tableview  
  12. {  
  13.     static NSString *ID = @"cell";  
  14.     Mycell *cell = [tableview dequeueReusableCellWithIdentifier:ID];  
  15.     if(!cell)  
  16.     {  
  17.         cell = [[Mycell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];  
  18.         cell.selectionStyle = UITableViewCellSelectionStyleNone;  
  19.         cell.textLabel.font = [UIFont systemFontOfSize:13.0];  
  20.     }  
  21.     return cell;  
  22.       
  23. }  
  24.   
  25.   
  26. //重写布局  
  27. -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier  
  28. {  
  29.     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];  
  30.     if(self)  
  31.     {  
  32.         self.button = [[UIButton alloc] initWithFrame:CGRectMake(00, [UIScreen mainScreen].bounds.size.widthself.frame.size.height)];  
  33.         [self.button setTitle:@"我是按钮点我" forState:UIControlStateNormal];  
  34.         [self.button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];  
  35.         self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;  
  36.         self.button.titleLabel.font = [UIFont systemFontOfSize:12.0];  
  37.         [self.contentView addSubview:self.button];  
  38.         [self.button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];  
  39.     }  
  40.     return self;  
  41. }  
  42.   
  43.   
  44. //给cell控件赋值  
  45. -(void)setModel:(DateModel *)model  
  46. {  
  47.     self.textLabel.text = [NSString stringWithFormat:@"日期:%@、信息:%@",model.date,model.message];  
  48.       
  49. }  
  50.   
  51. #pragma mark - 按钮点击事件,通过代理模式响应  
  52. -(void)btnClick:(UIButton *)btn  
  53. {  
  54.     [self.delegate didClickButton:btn];  
  55. }  
  56.   
  57. @end  

上述代码定义了一个代理,当按下按钮时,代理响应。

现在回到UItableviewController,代码如下:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  2. {  
  3.     Mycell *cell = [Mycell cellWithtableView:tableView];  
  4.     cell.model = self.Array[indexPath.row];  
  5.     cell.delegate = self;  
  6.     return cell;  
  7. }  

别忘了.delegate = self哦!代理执行的代码如下:

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #pragma mark - 代理事件  
  2. //跳转到下一界面并传值  
  3. -(void)didClickButton:(UIButton *)button  
  4. {  
  5.     Mycell *cell = (Mycell *)button.superview.superview;  
  6.     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];  
  7.     MessageController *vc = [[MessageController alloc]init];  
  8.     DateModel *model = self.Array[indexPath.row];  
  9.     vc.message = [NSString stringWithFormat:@"行号:第%ld行,日期:%@、信息:%@",(long)indexPath.row,model.date,model.message];  
  10.     [self.navigationController pushViewController:vc animated:YES];  
  11. }  

当我们的cell中按钮点击后,将会自动跳到这个代理方法中,我们获取到按钮所在的cell,通过indexPathforCel这个方法(系统API)可以获取到cell的行数,并拿到数据源,此时想要传值给下一个界面就变的非常简单。


特别提醒:

当同一个工厂方法创建多行cell中的button时,要分别做处理的话需要分别对应cell的button添加tag,设置代理事件时,通过tag值来区分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js - (初中级)常见笔试面试题

1.用 js 实现一个深拷贝 2.用 js 写一个数组去重 3. 用 js 对字符串进行反转 4. 用 js 请求范围内的质数个数 5.用 js 求数组中出现最多的数及其出现次数

iOS 支付宝SDK接入详解

一&#xff0c;在支付宝开放平台下载支付宝SDK&#xff08;https://openhome.alipay.com/platform/document.htm#down&#xff09; https://doc.open.alipay.com/doc2/detail.htm?spma219a.7629140.0.0.HpDuWo&treeId54&articleId104509&docType1 二&#xff0c;添…

面试基本知识点

文章目录面-什么是SEO面 - cookie / localstorage / sessionstorage的区别面 - promise面试题面 - 柯里化函数面 - 函数节流面 - 函数防抖HTML / CSS 知识点1、讲讲盒模型&#xff08;蚂蚁金服 2019.03 招行信用卡 2019.04 美团 作业帮&#xff09;2、根据盒模型解释边距重叠&a…

Redis 热点key

压测报redis 热点问题 热点问题概述 产生原因 热点问题产生的原因大致有以下两种&#xff1a; 用户消费的数据远大于生产的数据&#xff08;热卖商品、热点新闻、热点评论、明星直播&#xff09;。 在日常工作生活中一些突发的的事件&#xff0c;例如&#xff1a;双十一期间某些…

移动IM开发那些事:技术选型和常见问题

最近在做一个iOS IM SDK&#xff0c;在内部试用的阶段&#xff0c;不断有兄弟部门或者合作伙伴过来问各种技术细节&#xff0c;所以统一写一篇文章记录&#xff0c;统一介绍下一个IM APP的方方面面&#xff0c;包括技术选型(包括通讯方式,网络连接方式,协议选择)和常见问题。 …

webstrom打开通过顶部浏览器打开网页,被跳转到默认主页

重新开始工作啦&#xff0c;希望以后认真一点&#xff0c;并把遇到的问题都记录下来&#xff0c;虽然是小小白&#xff0c;但能无意间帮助到别人就更开心了呀 通过webstrom打开本地的文件时&#xff0c;发现跳转到了默认主页上&#xff0c;吐槽下&#xff0c;有些主页真的超级流…

mockjs(接口服务代理)

mock官网&#xff1a;http://mockjs.com/ 一、搭建一个练习项目 1.利用vue的项目脚手架进行搭建 命令&#xff1a; vue create mock-demo 截图&#xff1a; 2.安装相关的依赖 命令&#xff1a; #使用 axios 发送 ajax npm install axios --save #使用 mock.js 产生随机数据…

MD5算法原理

MD5&#xff08;单向散列算法&#xff09; 的全称是Message-Digest Algorithm 5&#xff08;信息-摘要算法&#xff09;&#xff0c;经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。MD5功能&#xff1a;输入任意长度的信息&#xff0c;经过处理&#xff0c;输…

python第五次作业——陈灵院

习题1&#xff1a;读入文件pmi_days.csv&#xff0c;完成以下操作&#xff1a;1.统计质量等级对应的天数&#xff0c;例如&#xff1a;优&#xff1a;5天良&#xff1a;3天中度污染&#xff1a;2天2.找出PMI2.5的最大值和最小值&#xff0c;分别指出是哪一天。 import csv impo…

iOS 二叉树相关算法实现

什么是二叉树&#xff1f; 在计算机科学中&#xff0c;二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”&#xff0c;左子树和右子树同时也是二叉树。二叉树的子树有左右之分&#xff0c;并且次序不能任意颠倒。二叉树是递归定义的&#xff0c;所…

vux 组件库首次使用安装

1、首先通过脚手架新建一个项目&#xff0c;过程略。 创建完项目后&#xff0c;在项目里安装vux&#xff0c; 通过命令 npm install vux --save 安装 2、安装vux-loader&#xff0c; 通过命令 npm install vux-loader --save-dev 安装&#xff08;vux文档没说明&#xff09; 3、…

爬取豆瓣top250

#xpath #第一种方法 可在开发者工具中找到标签&#xff0c;右键copy xpath&#xff0c;有时需去掉tbody标签 #第二种方法 简单学习xpath&#xff0c;自己书写&#xff0c;掌握基本语法即可&#xff0c;简单的层级关系#先将csv文件以记事本打开&#xff0c;更改编码为ASNI&…

LED音乐频谱之点阵

转载请注明出处&#xff1a;http://blog.csdn.net/ruoyunliufeng/article/details/37967455 一.硬件 这里的LED选择直插的雾面LED&#xff0c;亮度可以还不失美观。注意每行要加上限流电阻。74HC138&#xff08;三八译码器&#xff09;作为列选&#xff0c;每行都连着74HC595&a…

上架相关——App Store 上架流程

说实话&#xff0c;公司要上架一个自己做的一个小项目。为了完成这个任务&#xff0c;菜鸟的我一遍找资料一遍跟着做&#xff0c;一遍修改错误一遍查找解决方案。网上的资料大部分都是2015年以前的资料&#xff0c;资料有点不够过时&#xff0c;而且步骤配图也不是很详细&#…

上架相关——appstore 更新app版本

注&#xff1a;此片文章是基于app已经上架&#xff0c;也就是证书都已经配置好的前提下。 首先是还是app打包 修改版本号 修改project处的pp文件 检查无误后打包打包完成后upload to app store 漫长的等待。。 上传到appstore进入iTunesConnect 选择我的app 选择对应app点…

iOS开发 蓝牙技术4.0详解

前言 前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙? 什么是蓝牙? 随着蓝牙低功耗技术BLE&#xff08;Bluetooth Low Energy&#xff09;的发展&#xff0c;蓝牙技术…

前端面试题(五)

position的属性有哪些&#xff1f; 1、absolute生成绝对定位的元素&#xff0c;相对于值不为 static的第一个父元素进行定位。 2、fixed &#xff08;老IE不支持&#xff09;生成绝对定位的元素&#xff0c;相对于浏览器窗口进行定位。 3、relative生成相对定位的元素&#xff…

qrcode.js 二维码生成器

二维码生成 并显示&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"ko" …

AVPlayer设置从哪儿开始播放

avplayer 播放视频 首先介绍几个方法吧和属性吧。 - (id)addPeriodicTimeObserverForInterval:(CMTime)interval queue:(dispatch_queue_t)queue usingBlock:(void (^)(CMTime time))block 这个方法可以用于跟新进度条。 - (void)seekToTime:(CMTime)time completionHandler:(v…

老男孩爬虫实战密训课第一季,2018.6,初识爬虫训练-实战1-爬取汽车之家新闻数据...

1.爬虫介绍 编写程序&#xff0c;根据URL获取网站信息 2.用到的库 requests库 bs4库 3.内容及步骤 4.代码 import requests import os from bs4 import BeautifulSoup # 1.下载页面 ret requests.get(urlhttps://www.autohome.com.cn/news/) ret.encoding ret.apparent_encod…