IOS UITableViewCell详解及按钮点击事件处理实例

发布时间 - 2026-01-10 21:58:44    点击率:

IOS UITableViewCell详解及按钮点击事件处理

今天突然做项目的时候,又遇到处理自定义的UITableViewCell上按钮的点击事件问题。我知道有两种方式,可是突然想不起来之前是怎么做的了,好记性不如烂笔头,还是记录一下吧。

1、第一种方式给Button加上tag值

这里分为两种:一种是直接在原生的UITableViewCell上添加UIButton按钮,然后给UIButton设置tag值,然后在控制器里的方法里通过取数据,做界面跳转等。还是举个例子吧,省的回忆半天。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
   
  static NSString *identifier = @"Cell"; 
   
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
  if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
  } 
   User *user = _users[indexPath.row]; 
  cell.user = user; 
  //拍照button 
  UIButton *photographButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
  photographButton.frame = CGRectMake(221 , 10, 100, 44); 
  [photographButton setImage:[UIImage imageNamed:@"camera.png"] forState:UIControlStateNormal]; 
  [photographButton addTarget:self action:@selector(photographButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
  photographButton.tag = indexPath.row; 
  [cell.contentView addSubview:photographButton]; 
   
  return cell; 
} 

然后在点击事件中取数据,加信息

- (void)photographButtonClicked:(UIButton *)sender{ 
   User *user = _users[sender.tag]; 
  PhotoPickerController *photoPicker = [[PhotoPickerController alloc] init]; 
  photoPicker.user = user; 
  [self.navigationController pushViewController:photoPicker animated:YES]; 
   
} 

以上两个方法都是在同一个控制器中。

2、自定义了UITableViewCell,那么就在UITableViewCell里添加一个代理方法。

#import <UIKit/UIKit.h> 
 
@protocol TermCellDelegate <NSObject> 
 
- (void)choseTerm:(UIButton *)button; 
 
@end 
 
@interface TermCell : UITableViewCell 
 
@property (retain, nonatomic) IBOutlet UIButton *checkButton; 
@property (retain, nonatomic) IBOutlet UILabel *termLabel; 
 
@property (assign, nonatomic) BOOL isChecked; 
@property (assign, nonatomic) id<TermCellDelegate> delegate; 
 
- (IBAction)checkAction:(UIButton *)sender; 
 
@end 
 
#import "TermCell.h" 
 
@implementation TermCell 
 
- (void)awakeFromNib 
{ 
  // Initialization code 
} 
 
- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
  [super setSelected:selected animated:animated]; 
 
  // Configure the view for the selected state 
} 
 
- (void)layoutSubviews 
{ 
  [super layoutSubviews]; 
  if (_isChecked) { 
    [_checkButton setBackgroundImage:[UIImage imageNamed:@"task_state_checked"] forState:UIControlStateNormal]; 
  } else { 
    [_checkButton setBackgroundImage:[UIImage imageNamed:@"task_state_unchecked"] forState:UIControlStateNormal]; 
  } 
} 
 
- (void)dealloc { 
  [_checkButton release]; 
  [_termLabel release]; 
  [super dealloc]; 
} 
 
- (IBAction)checkAction:(UIButton *)sender { 
  if ([_delegate respondsToSelector:@selector(choseTerm:)]) { 
    sender.tag = self.tag; 
    [_delegate choseTerm:sender]; 
  } 
} 
 
@end 

然后再控制器中实现Cell的代理方法即可

#pragma mark - TermCellDelegate 
- (void)choseTerm:(UIButton *)button 
{ 
  _clickIndex = button.tag; 
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"确定修改学期吗?" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil nil]; 
  [alertView show]; 
} 

当然,这里也可以做界面跳转,取数据依然用button的tag值。

补充:这里还可以在代理方法中将cell本身传回去,这样不用从数组取数据,直接利用cell的数据对象,更简单吆。

3、是直接在自定义的Cell里面跳转,这种耦合性比较强。思路先是找到button的父控制器,然后做界面跳转或者其他操作。有这样一个工具方法

#import "UIView+Additions.h" 
 
@implementation UIView (Additions) 
 
- (UIViewController *)viewController 
{ 
  UIResponder *next = [self nextResponder]; 
  do { 
    if ([next isKindOfClass:[UIViewController class]]) { 
      return (UIViewController *)next; 
    } 
     
    next = [next nextResponder]; 
     
  } while (next != nil); 
   
   
  return nil; 
} 

头文件就不写了,很简单的扩展。

- (void)setWeiboModel:(WeiboModel *)weiboModel 
{ 
  if (_weiboModel != weiboModel) { 
    [_weiboModel release]; 
    _weiboModel = [weiboModel retain]; 
  } 
   
  __block WeiboCell *this = self; 
  _userImage.touchBlock = ^{ 
    NSString *nickName = this.weiboModel.user.screen_name; 
    UserViewController *userCtrl = [[UserViewController alloc] init]; 
    userCtrl.userName = nickName; 
    [this.viewController.navigationController pushViewController:userCtrl animated:YES]; 
    [userCtrl release]; 
  }; 
   
} 

这里是给Cell赋值model,然后点击事件是用Block实现的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# IOS  # UITableViewCell  # UITableViewCell按钮点击事件  # UITableViewCell详解及实例  # iOS优化UITableViewCell高度计算的一些事儿  # 详解IOS UITableViewCell 的 imageView大小更改  # 详解ios中自定义cell  # 自定义UITableViewCell  # IOS UITableView和UITableViewCell的几种样式详细介绍  # ios开发UITableViewCell图片加载优化详解  # 跳转  # 自定义  # 都是  # 器中  # 就在  # 还可以  # 就不  # 两种  # 半天  # 希望能  # 很简单  # 这样一个  # 然后再  # 写了  # 较强  # 怎么做  # 有两种  # 谢谢大家  # 或者其他  # 第一种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 简单实现Android文件上传  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  香港服务器选型指南:免备案配置与高效建站方案解析  如何在Windows环境下新建FTP站点并设置权限?  如何用PHP快速搭建CMS系统?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Swift中swift中的switch 语句  浅谈Javascript中的Label语句  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  香港网站服务器数量如何影响SEO优化效果?  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Android利用动画实现背景逐渐变暗  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  如何在云指建站中生成FTP站点?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  Laravel如何记录自定义日志?(Log频道配置)  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel如何使用Blade组件和插槽?(Component代码示例)  如何在阿里云香港服务器快速搭建网站?  EditPlus 正则表达式 实战(3)  网站建设要注意的标准 促进网站用户好感度!  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  再谈Python中的字符串与字符编码(推荐)  Laravel如何实现数据库事务?(DB Facade示例)  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Android Socket接口实现即时通讯实例代码  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  如何在建站之星网店版论坛获取技术支持?  如何在云主机快速搭建网站站点?  如何在服务器上配置二级域名建站?  JS实现鼠标移上去显示图片或微信二维码  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何快速生成橙子建站落地页链接?  Python文件异常处理策略_健壮性说明【指导】