IOS UITableViewCell详解及按钮点击事件处理实例
程序员文章站
2024-02-19 12:40:28
ios uitableviewcell详解及按钮点击事件处理
今天突然做项目的时候,又遇到处理自定义的uitableviewcell上按钮的点击事件问题。我知道有两种方式...
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实现的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!