文档章节

自定义UITableViewCell 上的多个按钮点击事件处理

 无边小仙
发布于 2015/08/19 15:54
字数 620
阅读 30
收藏 0

前几天工作遇到处理自定义的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];  
      
}

以上两个方法都是在同一个控制器中。另外一种,自定义了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里面跳转,这种耦合性比较强。思路先是找到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];  
    };  
      
}


© 著作权归作者所有

无边小仙

粉丝 2
博文 6
码字总数 5890
作品 2
郑州
私信 提问
UITableViewCell的accessoryType属性

使用的话,例如: cell.accessoryType = UITableViewCellAccessoryNone;//cell没有任何的样式 cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;//cell的右边有一个小箭头......

今日竹石
2014/01/23
167
0
UITableView-的cell 自定义(高度and样式)

UITableView的强大更多程度上来自于可以任意自定义UITableViewCell单元格。通常,UITableView中的Cell是动态的,在使用过程中,会创建一个Cell池,根据每个cell的高度(即tableView:heightF...

谁家的阿毛
2014/05/12
660
0
让UITableView响应touch事件

我们知道UITableView没有像UIButton那样可以通过addTarget方法来监听touch事件,因此在某些场合,特别是在UITableViewCell中包含UITextField的时候,我们很有可能想通过点击UITableView的其他...

vimfung
2012/07/01
13.4K
0
关于UITableViewCell和UITableView之间的消息传递

问题:当UITableViewCell中发生点击事件(或者其他事件)时,它是如何通知UITableView然后调用UITableView的delegate呢? 详细描述:UITableViewCell中没有属性可以设置它所在的UITableView...

罗包子
2015/04/13
323
0
iOS开发系列--UITableView全面解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jianxin160/article/details/47753205 --UIKit之UITableView 概述 在iOS开发中UITableView可以说是使用最广泛...

KenshinCui
2015/08/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
4
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
8
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
877
10
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部