UITextView子类点击didSelectRowAtIndexPath

时间:2012-02-11 19:48:01

标签: iphone objective-c uitextview uigesturerecognizer

我有一个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会做什么)的正确方法是什么?

2 个答案:

答案 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];

会起作用,但我认为自己调用委托方法至少可以说是糟糕的风格。