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

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

[objc] view plain copy  
  1. @protocol MycellDelegate <NSObject>
  2. @optional
  3. -(void)didClickButton:(UIButton *)button;
  4. @end
  5. @interface Mycell : UITableViewCell
  6. +(instancetype)cellWithtableView:(UITableView *)tableview;
  7. @property(nonatomic,strong)DateModel *model;
  8. @property(nonatomic,weak) id<MycellDelegate> delegate;

.m文件如下:

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

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

现在回到UItableviewController,代码如下:

[objc] view plain copy  
  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  
  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值来区分

iOS 自定义Cell按钮的点击代理事件相关推荐

  1. 纯CSS自定义button按钮的点击特效

    纯css自定义button按钮的点击特效,实现背景变化 效果图如下: 代码如下: <!DOCTYPE html> <html> <head><meta cha ...

  2. iOS——自定义cell

    iOS--自定义cell 在写自定义cell怎么实现之前,先来看一下自定义cell的作用和用法,这一点远远比怎么实现有用的多,在进行了两天的网易云仿写后,才发现自己对自定义cell的理解完全是错的,按 ...

  3. iOS 自定义返回按钮,保留系统滑动返回

    1.简介 使用苹果手机,最喜欢的就是用它的滑动返回.作为一个开发者,我们在编写很多页面的时候,总是会因为这样那样的原因使得系统的滑动返回不可用.使用导航栏push出一个控制器,我们在控制器中自定义了一 ...

  4. iOS 自定义cell

    思路 1.新建TAYTableViewCell 继承自UITableViewCell 2.添加需要使用的属性 3.写方法 4.应用 新建TAYTableViewCell 如图: 添加需要的属性 以一个 ...

  5. 高德地图去掉定位按钮_高德地图自定义定位按钮及点击事件

    最近使用了一下高德地图,使用期间将出现的问题记录一下.文中出现不对的地方,悉听各路大神指正.2018年11月23日15:59:46 1.首先我们初始化map控制对象aMap .if (aMap ==n ...

  6. iOS 自定义cell【商品信息】 : 左侧为商品图片,右侧为商品名称,采购价,小计及数量等信息

    前言 在做ERPapp或者电商app经常需要展示商品信息,本文以入库单详情为例子,具体效果如下: code 用法 V: cell的创建 case ERPStockInOrderDetailVSecti ...

  7. Android AOSP LatinIME输入法自定义图片按钮

    文章目录 前言 一.引进图片按钮 二.添加映射 三.attrs.xml 四.KeyboardIconsSet.java 五.Constants.java 六.KeyboardCodesSet.java ...

  8. ios cell点击对勾_带图像和对勾的iOS自定义TableView

    ios cell点击对勾 In this tutorial, we'll be developing an iOS Application that contains a custom TableVi ...

  9. ios开发返回按钮消失_iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决...

    我相信针对每一个iOS开发者来说~除了根视图控制器外~所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面~其实~在很多应用和APP中~用户已经习惯了这个功能~然而~作为开发者的我们 ...

最新文章

  1. Facade模式——设计模式学习笔记
  2. start ssh-agent
  3. 泥浆配制_朝政泥浆——广西田阳县百东河水库溢洪道穿越钻泥浆配制简述(3)...
  4. 蓝桥杯 之 基础练习10:十进制转十六进制
  5. 利用ffmpeg进行摄像头提取视频编码为h264通过RTP发送数据到指定的rtp地址
  6. Coding Interview Guide -- 括号字符串的有效性和最长有效长度
  7. C++ Gui Qt4 书籍代码在VS2008上正确编译使用
  8. opencv_haartraining.exe 分类器训练----命令执行,执行项学习(1)
  9. Java 会被新兴语言取代吗?
  10. 快速非支配排序算法流程
  11. te40终端不设网关_默认网关不可用什么原因|默认网关不能用解决方法|默认网关怎么设置...
  12. Linux Ansible自动化运维 set_fact 模块
  13. 同花顺_代码解析_技术指标_Z_2
  14. 15张图详解四线制SPI通讯
  15. 3.6 创建和使用附件字段
  16. [转]gps中的广义和狭义相对论效应
  17. yarn和npm区别
  18. Vue.js 使用 vue-video-player 视频播放器(最全面)
  19. C#NetFrame3.5 JsonHelper
  20. android系统应用程序设置时间,Android应用程序设置系统时间的方法

热门文章

  1. Linux C 时间函数
  2. 解决HTML embed标签显示在div上层(not z-index)
  3. 机器学习:贝叶斯和优化方法_Facebook使用贝叶斯优化在机器学习模型中进行更好的实验
  4. 董明珠炮轰国产车的创始人不开自己生产的车,事实果真如此吗?
  5. 《草原安魂曲》《自由意志》及其他我喜欢的电影海报
  6. SystemVerilog声明的位置
  7. Fedora telnet配置
  8. python安装缺少api怎么办_请问缺少win32api模块该如何解决?
  9. oracle装了客户端怎么登陆账号,分享Oracle 11G Client 客户端安装步骤(图文详解)...
  10. 计算机七个计算原理,计算机组成原理计算题(7页)-原创力文档