UIGestureRecognizer和UITableViewCell问题

时间:2011-01-05 13:04:36

标签: ios iphone ipad uitableview uigesturerecognizer

我在UISwipeGestureRecognizer方法中将UITableViewCell附加到cellForRowAtIndexPath:,如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
        gesture.direction = UISwipeGestureRecognizerDirectionRight;
        [cell.contentView addGestureRecognizer:gesture];
        [gesture release];
    }
    return cell;
}

但是,didSwipe方法在成功滑动时总是被调用两次。我最初认为这是因为手势开始和结束,但如果我注销gestureRecognizer本身,它们都处于“结束”状态:

-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {

    NSLog(@"did swipe called %@", gestureRecognizer);
}

控制台:

2011-01-05 12:57:43.478 App[20752:207] did swipe called <UISwipeGestureRecognizer: 0x5982fa0; state = Ended; view = <UITableViewCellContentView 0x5982c30>; target= <(action=didSwipe:, target=<RootViewController 0x5e3e080>)>; direction = right>
2011-01-05 12:57:43.480 App[20752:207] did swipe called <UISwipeGestureRecognizer: 0x5982fa0; state = Ended; view = <UITableViewCellContentView 0x5982c30>; target= <(action=didSwipe:, target=<RootViewController 0x5e3e080>)>; direction = right>

我真的不知道为什么。我试着明确检查结束状态,但这没有任何帮助,因为它们都以“结束”的方式进入......任何想法?

4 个答案:

答案 0 :(得分:109)

您可以将其添加到viewDidLoad的表格视图中,而不是直接将手势识别器添加到单元格中。

didSwipe - 方法中,您可以按如下方式确定受影响的IndexPath和单元格:

-(void)didSwipe:(UIGestureRecognizer *)gestureRecognizer {

  if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
        CGPoint swipeLocation = [gestureRecognizer locationInView:self.tableView];
        NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:swipeLocation];
        UITableViewCell* swipedCell = [self.tableView cellForRowAtIndexPath:swipedIndexPath];
        // ...
  }
}

答案 1 :(得分:0)

它适用于app delegate

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{

// code

}

答案 2 :(得分:0)

我遇到了同样的问题,并通过在表格视图属性中勾选“滚动已启用”来解决它。

我的表格视图不需要滚动,因此它不会以任何其他方式影响应用程序,除非现在我在刷卡手势后没有得到第一个无响应的点击。

答案 3 :(得分:-1)

在AwakeFromNib方法中添加手势没有问题。

class TestCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

        let panGesture = UIPanGestureRecognizer(target: self,
                                            action: #selector(gestureAction))
        addGestureRecognizer(panGesture)
    }

    @objc func gestureAction() {
        print("gesture action")
    }
}