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文件异常处理策略_健壮性说明【指导】

