在不禁用上下文菜单的情况下管理 UITextfiled 上的长按?

Posted

技术标签:

【中文标题】在不禁用上下文菜单的情况下管理 UITextfiled 上的长按?【英文标题】:Manage long press on UITextfiled without disabling context menu? 【发布时间】:2016-10-27 06:20:55 【问题描述】:

我有 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】:

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

- (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:] 添加“静态”故障要求,但在许多情况下,您不必轻易引用两个识别器(例如在本例中)。 在很多情况下,这就足够了。 但是,手势识别系统也让您有机会“即时”安装故障要求。

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

OTOH 从 -gestureRecognizer:shouldRequireFailureOfGestureRecognizer: 返回 YES 的效果与您调用 [first requireFailureOfGestureRecognizer:second] 的效果相同。

【讨论】:

以上是关于在不禁用上下文菜单的情况下管理 UITextfiled 上的长按?的主要内容,如果未能解决你的问题,请参考以下文章

在不修改实体类(注释)或数据上下文(使用 fluentapi)的情况下禁用标识(自动递增)

在不创建上下文的情况下禁用 Spring 和 Junit5 测试

在不禁用用户交互的情况下阻止 UIWebView 输入显示 UIKeyboard

如何在不创建管理页面菜单的情况下获取页面的 slug 名称

如何在不使项目变灰的情况下禁用 UITabBarItem

如何在不禁用突出显示的情况下禁用合适的触摸行