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

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
ios 点击按钮删除cell、ios 点击cell上的按钮、ios cell按钮点击事件、cell上的按钮点击事件、cell里的按钮点击事件,以便于您获取更多的相关知识。

时间: 2024-12-03 00:25:00

IOS UITableViewCell详解及按钮点击事件处理实例_IOS的相关文章

IOS CocoaPods详解之制作篇_IOS

学会使用别人的Pods依赖库以后,你一定对创建自己的依赖库跃跃欲试,今天就来揭开Pods依赖库创建过程的神秘面纱.整个创建过程都以我实现的一个名称为WZMarqueeView跑马灯效果的view为例,步骤如下: 一.创建自己的github仓库 CocoaPods都托管在github上(官方链接为:https://github.com/CocoaPods),所有的Pods依赖库也都依赖github,因此第一步我们需要创建一个属于自己的github仓库.仓库创建界面如下图: 上图中标了序号的共6处,

IOS CocoaPods详解之进阶篇_IOS

一.Podfile.lock文件 上文讲过,在开始使用CocoaPods,执行完pod install之后,会生成一个Podfile.lock文件.这个文件看起来跟我们关系不大,实际上绝对不应该忽略它. 该文件用于保存已经安装的Pods依赖库的版本,通过CocoaPods安装了SBJson.AFNetworking.Reachability三个POds依赖库以后对应的Podfile.lock文件内容为: PODS: - AFNetworking (2.1.0): - AFNetworking/N

详解Bootstrap按钮_javascript技巧

描述 Bootstrap Button(按钮)JavaScript 插件允许您加强按钮的功能.您可以控制按钮的状态,也可以为组件创建按钮组,比如工具条. 什么是必需的 您必须引用 jquery.js 和 bootstrap-button.js - 这两个 JavaScript 文件.它们都位于 docs/assets/js 文件夹内. 如何使用它 您可以不编写任何 JavaScript 只通过标记使用该插件,也可以通过 JavaScript 启用按钮. Bootstrap 提供了一些选项来定义按

iOS 正则表达式详解_IOS

一.系统自带正则表达式用法 除了正则可以用,还有NSScanner这个类可以达到某些相同的效果 1.创建正则表达式对象 NSString * reg = @"[0-9]+";//字符串正则表达式NSError *error = NULL;//错误对象NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:reg options:NSRegularExpressionCaseInsens

详解python3百度指数抓取实例_python

百度指数抓取,再用图像识别得到指数 前言: 土福曾说,百度指数很难抓,在淘宝上面是20块1个关键字: 哥那么叼的人怎么会被他吓到,于是乎花了零零碎碎加起来大约2天半搞定,在此鄙视一下土福 安装的库很多: 谷歌图像识别tesseract-ocr pip3 install pillow pip3 install pyocr selenium2.45 Chrome47.0.2526.106 m or Firebox32.0.1 chromedriver.exe 图像识别验证码请参考:http://ww

详解适配iOS10 的相关权限设置_IOS

在最新版本的iOS10系统中,如果你的项目中访问了隐私数据,比如:相机.相册.录音.定位.联系人等等.涉及到权限问题. 解决办法(fix method): 在info.plist -Source Code中添加 UsageDescription相关的key, 描述字符串自己随意填写就可以,但是一定要填写,不然会引发包无效的问题,导致上传打包后构建版本一直不显示. <!-- 相册 --> <key>NSPhotoLibraryUsageDescription</key>

详解PHP归并排序的实现_php实例

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表.归并排序的一个缺点是它需要存储器有另一个大小等于数据项数目的数组.如果初始数组几乎占满整个存储器,那么归并排序将不能工作,但是如果有足够的空间,归并排序会是一个很好的选择. 假设待排序的序列: 4 3 7 9 2 8 6 先说思路,归并排序的中心思想是将两个已经排序好的序列,合并成一个排序的序列. 上面的序列可以分成: 4 3 7 9 和 2  8  6 这两个序列,然后对这两个序列分别排序:结果为: 设置为序列A,与序列

详解JavaScript基于面向对象之继承实例_javascript技巧

javascript面向对象继承的简单实例: 作为一门面向对象的语言,继承自然是它的一大特性,尽管javascript的面向对象的实现机制和和c#和java这样典型的面向对象不同,但是继承的基本特点还是具有的,简单的说就是获得父级的方法和属性,下面是一段简单的实例,大家有兴趣可以分析一下: window.onload = function(){ function parent(age,name){ this.age = age; this.name = name; } parent.protot

详解php中 === 的使用_php实例

当比较简单类型时(如String int float bool),判断的是"相等 && 类型一样" $num1 = 123; $num2 = 123; $num3 = '123'; var_dump($num1 === $num2);//输出 bool(true) var_dump($num3 === $num1);//输出 bool(false) 因为$num3是字符串 $num1是整型 比较对象时,判断的是"是否指向同一个对象" class Pe