如何从UITableView的iphone获得的UITableView IndexPath?(How

2019-06-27 00:57发布

在我的iPhone应用程序我有一个消息屏幕。 我已经加入UITapGestureRecognizerUIViewController ,也是我有一个UITableview在屏幕上。 我想选择UITableViewCell ,但我不能选择UITableView因为UITapGestureRecognizer 。 当我触摸屏幕时,只有敲击手势动作叫做但是UITableView委托didSelectRowAtIndexPath:不叫。 任何人都可以请帮我在这两个点触手势和工作UITableView:didSelectRowAtIndexPath: 。 提前致谢。

Answer 1:

虽然我更喜欢马特·迈耶的建议或我使用自定义的手势识别器,另一种解决方案,不涉及定制手势识别的其他建议,将有水龙头手势识别器识别你是否拍了拍你的tableview中的单元格,如果是的话,手动调用didSelectRowAtIndexPath ,例如:

- (void)handleTap:(UITapGestureRecognizer *)sender
{
    CGPoint location = [sender locationInView:self.view];

    if (CGRectContainsPoint([self.view convertRect:self.tableView.frame fromView:self.tableView.superview], location))
    {
        CGPoint locationInTableview = [self.tableView convertPoint:location fromView:self.view];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:locationInTableview];
        if (indexPath)
            [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];

        return;
    }

    // otherwise proceed with the rest of your tap handling logic
}

因为如果你正在做什么复杂的与你的tableview(例如,在单元格编辑,自定义控制等),你失去了这种行为,这是最理想的,但如果你只是希望收到didSelectRowAtIndexPath ,那么这可能做的工作。 其他两种方法(独立观点或自定义手势识别),让你保留完整的tableview的功能,但是这可能是工作,如果你只是需要一些简单,你不需要的tableview中的内置功能的其余部分。



Answer 2:

您可以使用TagGesture委托:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isDescendantOfView:yourTableView]) {
        return NO;
    }

    return YES;
}

希望这可以帮助。



Answer 3:

一个简单的方法来做到这一点是有两种观点:一个包含要点击手势要上来看,和包含的tableview之一。 你可以附上UITapGestureRecognizer到你想要的工作的看法,然后它不会阻止你的UITableView。



Answer 4:

假设你想点击手势,除了在tableview中工作无处不在,你可以继承点击手势识别,创造一个识别器会忽略包含在一个阵列中的任何子视图excludedViews ,防止它们产生一个成功的手势(因此将它传递给didSelectRowAtIndexPath或其他):

#import <UIKit/UIGestureRecognizerSubclass.h>

@interface MyTapGestureRecognizer : UITapGestureRecognizer
@property (nonatomic, strong) NSMutableArray *excludedViews;
@end

@implementation MyTapGestureRecognizer

@synthesize excludedViews = _excludedViews;

- (id)initWithTarget:(id)target action:(SEL)action
{
    self = [super initWithTarget:target action:action];
    if (self)
    {
        _excludedViews = [[NSMutableArray alloc] init];
    }

    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];

    CGPoint location = [[touches anyObject] locationInView:self.view];

    for (UIView *excludedView in self.excludedViews)
    {
        CGRect frame = [self.view convertRect:excludedView.frame fromView:excludedView.superview];

        if (CGRectContainsPoint(frame, location))
            self.state = UIGestureRecognizerStateFailed;
    }
}

@end

然后,当你要使用它,只需指定要排除什么控制:

MyTapGestureRecognizer *tap = [[MyTapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[tap.excludedViews addObject:self.tableView];
[self.view addGestureRecognizer:tap];


文章来源: How get UITableView IndexPath from UITableView iphone?