问题来源:
在iOS开发中经常会出现这样的需求:tableViewCell上需要放置按钮,用来点击之后进行一些操作,这个时候,我们需要识别到Button处于哪一行cell上,并将相应的数据传入过去,处理这个问题的方法是多种多样的,今天我将这个问题整理,欢迎各位提供除了本文之外的其它方法,大神请自动跳过,不喜勿喷.
本文demo
解决问题:
下面主要使用了三种方法来识别Button在UItableViewCell中所处的位置,各有利弊,用得到这些方法的朋友可以自己选择
一.使用tag
这是最常用的一个方法了,使用方便,但是需要注意添加tag的时候不能与别的tag想冲突造成不必要的麻烦,没有什么可说的,直接上代码
//在cell中
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
TagCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tagID" forIndexPath:indexPath];
cell.titleL.text = [NSString stringWithFormat:@"我是第%ld行",indexPath.row];
cell.tagBtn.tag = btnTag +indexPath.row;
[cell.tagBtn addTarget:self action:@selector(tapBtn:) forControlEvents:UIControlEventTouchUpInside];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;}
//点击事件
` - (void)tapBtn:(UIButton *)sender{
NSString *str = [NSString stringWithFormat:@"点击了第%ld行",sender.tag-btnTag];
UIAlertController *cc = [UIAlertController alertControllerWithTitle:@"提示" message:str preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[cc addAction:cancel];
[self presentViewController:cc animated:YES completion:nil];}`
二.下面是第二种方法
通过使用addtarget的方法属性获取event事件,最终获取点击的Button在tableView中的位置,再获取indexPath,例如
- (void)tapBtn:(UIButton *)sender event:(UIEvent *)event{
//通过event获取手指的位置
UITouch *touch = [[event allTouches] anyObject];
//获取手指在tableView中的位置
CGPoint point = [touch locationInView:tableViewG];
//获取indexPath
NSIndexPath *index = [tableViewG indexPathForRowAtPoint:point];
if (index) {
NSString *str = [NSString stringWithFormat:@"点击了第%ld行",index.row];
UIAlertController *cc = [UIAlertController alertControllerWithTitle:@"提示" message:str preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}];
[cc addAction:cancel];
[self presentViewController:cc animated:YES completion:nil];
}}
这种方法的特点是可以随时调用,获取Button的位置,如果你用的不是自定义的tableViewCell,而是把Button作为tableViewCell的accessoryView的话,这个方法的使用还是很方便的
三.利用代理和indexPath
将indexPath作为cell的属性传过去,然后在利用delegate作为参数传过来,这样可以在使用自定义的cell的时候有效的解耦,并且避免第一种方法那样tag过多而出现冲突的问题
在cell中:
@protocol clickDelegate
- (void)clickAtIndex:(NSIndexPath *)indexPath;
@end
@interface IndexCell : UITableViewCell
@property(nonatomic,strong)UIButton *tagBtn;
@property(nonatomic,strong)UILabel *titleL;
@property(nonatomic,strong)NSIndexPath *myIndex;
@property(nonatomic,weak)id
@end
VC中:
IndexCell *cell = [tableView dequeueReusableCellWithIdentifier:@"indexID" forIndexPath:indexPath]; cell.titleL.text = [NSString stringWithFormat:@"我是第%ld行",indexPath.row]; cell.selectionStyle = UITableViewCellSelectionStyleNone; cell.delegate = self; cell.myIndex = indexPath;
如果大家有好的方法请给我留言交流,文笔粗浅,以后再更新了