今天突然做项目的时候,又遇到处理自定义的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
- #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];
- }
第二种,是直接在自定义的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];
- };
- }