管理长按UITextfiled而不禁用上下文菜单?

时间:2016-10-27 06:20:55

标签: ios objective-c uitextfield uigesturerecognizer

我有UITableView,它的单元格有一个UITextField。

现在我在UITextField中添加了长手势,但它无效。当我在文本字段上点击长手势时,它总是显示上下文菜单(选择,复制剪切,过去等)。

我的问题是如何在UITextFiled中管理长手势和上下文菜单。

我尝试过以下代码:

longGesture = [[UILongPressGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleLongPress:)];
longGesture.minimumPressDuration = 2.0; //seconds
longGesture.delegate = self;

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
    CGPoint p = [gestureRecognizer locationInView:self.tableView];

    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
    if (indexPath == nil) {
        NSLog(@"long press on table view but not on a row");
    } else if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        NSLog(@"long press on table view at row %ld", indexPath.row);
    } else {
        NSLog(@"gestureRecognizer.state = %ld", gestureRecognizer.state);
    }
}

Tableview委托方法

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

    Note *obj = [self.dataArr objectAtIndex:indexPath.row];

    TableViewCell *Cell = [self.tableView dequeueReusableCellWithIdentifier:@"cell"];

    if (Cell == nil) {

        Cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
        Cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    else{
        Cell.memoField.text = obj.memoRowText;
    }

    Cell.memoField.userInteractionEnabled = YES;
    [Cell.memoField addGestureRecognizer:longGesture];
    Cell.memoField.delegate = self;
    Cell.memoField.tag = indexPath.row;

    return Cell;
}

1 个答案:

答案 0 :(得分:2)

您需要在显示上下文菜单的手势和长按手势之间设置失败要求。具体来说,您需要菜单识别器要求您长按失败(即您需要菜单识别器等到它排除了长按)。在代码中,一种方法是实现此委托方法。

call

这些方法可能有点令人困惑。 请记住,您可以使用- (BOOL)gestureRecognizer:(UIGestureRecognizer *)longPress shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)other { if (other.view /* is a text field in the table view */) { return YES; } else { return NO; } } 添加“静态”失败要求,但在许多情况下,您不必轻易地引用两个识别器(例如在这种情况下)。 在许多情况下,这就足够了。 但是,手势识别器系统还为您提供了“即时”安装故障要求的机会。

-[UIGestureRecognizer requireGestureRecognizerToFail:]返回YES与调用-gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:具有相同的效果(其中[second requireFailureOfGestureRecognizer:first]first是该方法的第一个和第二个参数)。

OTOH从second返回YES与您拨打-gestureRecognizer:shouldRequireFailureOfGestureRecognizer:的效果相同。