附件按钮的事件不可用。即事件无法传递到 UITableViewDelegate 的accessoryButtonTappedForRowWithIndexPath 方法。
也许你会说,我们可以给 UIButton 加上一个 target。
好,让我们来看看行不行。在上面的代码中加入:
[button addTarget:self action:@selector(btnClicked:event:) forControlEvents:UIControlEventTouchUpInside];
然后实现btnClicked方法,随便在其中添加点什么。
点击每个 UIButton,btnClicked 方法中的代码被调用了!一切都是那么完美。
但问题在于,每个 UITableViewCell 都有一个附件按钮,在点击某个按钮时,我们无法知道到底是哪一个按钮发生了点击动作!因为addTarget 方法无法让我们传递一个区别按钮们的参数,比如 indexPath.row 或者别的什么对象。addTarget 方法最多允许传递两个参数:target和 event,而我们确实也这么做了。但这两个参数都有各自的用途,target 指向事件委托对象——这里我们把 self 即 UIViewController实例传递给它,event 指向所发生的事件比如一个单独的触摸或多个触摸。我们需要额外的参数来传递按钮所属的 UITableViewCell 或者行索引,但很遗憾,只依靠Cocoa 框架,我们无法做到。
但我们可以利用 event 参数,在 btnClicked 方法中判断出事件发生在UITableView的哪一个 cell 上。因为 UITableView 有一个很关键的方法 indexPathForRowAtPoint,可以根据触摸发生的位置,返回触摸发生在哪一个 cell 的indexPath。 而且通过 event 对象,我们也可以获得每个触摸在视图中的位置:
// 检查用户点击按钮时的位置,并转发事件到对应的accessorytapped事件
- (void)btnClicked:(id)senderevent:(id)event
{
NSSet *touches =[event allTouches];
UITouch *touch =[touches anyObject];
CGPointcurrentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath= [self.tableView indexPathForRowAtPoint:currentTouchPosition];
if (indexPath!= nil)
{
[self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath:indexPath];
}
}
这样,UITableView的accessoryButtonTappedForRowWithIndexPath方法会被触发,并且获得一个indexPath 参数。通过这个indexPath 参数,我们可以区分到底是众多按钮中的哪一个附件按钮发生了触摸事件:
-(void)tableView:(UITableView*)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath{
int* idx= indexPath.row;
//在这里加入自己的逻辑
⋯⋯
}
2、为每个accessoryview设置不同的tag,根据tag区分
3\
- UITableViewCell *cell = (UITableViewCell *)[btn superview];
- NSIndexPath *indexPath = [_myTableView indexPathForCell:cell];
- NSLog(@"indexPath is = %i",indexPath.row);
注释:btn是你通过代码的方式添加到cell的一个Button,_myTableView是UITableView的一个关联变量。
3:通过UITableViewCell 里面的按钮事件 来获取 该按钮所在的IndexPath
1:注册事件:
- [selectButton addTarget:self action:@selector(FE_selectAnnotation:withEvent:) forControlEvents:UIControlEventTouchUpInside];
- NSIndexPath *indexPath = [tableView indexPathForRowAtPoint: [[[event touchesForView: btn] anyObject] locationInView:tableView]];
- NSLog(@"%d",indexPath.row);