我有一个UITextView子类,其NSIndexPath
属性位于UITableViewCell
内。当您点按它时,我希望能够拨打didSelectRowAtIndexPath
。
这就是我所拥有的:
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self action:nil];
[theTextView addGestureRecognizer:singleFingerTap];
singleFingerTap.delegate = self;
....
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
CustomTextView *theTextView = (CustomTextView *)touch.view;
NSLog(@"%@", theTextView.indexPath);
return YES;
}
我从this question看到,我甚至可能需要打破我的didSelectRowAtIndexPath
逻辑,这很好。我已经知道了被挖掘的视图的索引路径。
在手势识别器方法中调用此tableView方法(或didSelectRowAtIndexPath
会做什么)的正确方法是什么?
答案 0 :(得分:2)
I answered a similar question here。基本上当你打电话时:
[tableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionNone];
tableview不会触发tableview的委托上的tableView:didSelectRowAtIndexPath:
,所以另外你被迫直接调用(因为你在委托方法中编写代码没有问题):
[tableView.delegate tableView:tableView didSelectRowAtIndexPath:path];
此外,你为行动传递nil
的确不是手势识别器的工作方式:
[[UITapGestureRecognizer alloc] initWithTarget:self action:nil];
一般来说,你会这样做:
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];
这基本上告诉手势识别器在接收到水龙头时调用tapRecognized:
方法。所以基本上将它全部包装起来(我假设这是在UITableViewController
或具有名为tableView
的属性的对象,默认情况下为UITableViewController
。
-(void)tapRecognized:(UITapGestureRecognizer *)tapGR{
// there was a tap
CustomTextView *theTextView = (CustomTextView *)tapGR.view;
NSIndexPath *path = theTextView.indexPath;
[self.tableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionNone];
[self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:path];
}
答案 1 :(得分:1)
如果您需要同时执行X
手势以及点击表格视图行,只需创建一个方法X
并从您的手势识别器方法以及您的didSelectRowAtIndexPath
表视图委托方法。
当然,理论上,
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
会起作用,但我认为自己调用委托方法至少可以说是糟糕的风格。