iOS禁用Swift中的双击手势识别器

时间:2016-08-19 11:01:44

标签: ios objective-c iphone uitableview uigesturerecognizer

我正在使用TableView处理应用,现在我遇到了下面列出的问题。

  • 在我的TableView中有UITextView,它必须是可选择的,但不可编辑(因为我需要使用并继续链接)。
  

我的问题是:
  当我按照每个人的方式点击链接时,它不起作用。我需要更长时间才能使它工作。我认为这是因为“Selectable”属性带来了Double Tap Gesture识别器,所以我的textView检查是否有第二次点击,但我不知道如何找到并删除只有双击识别器。

我该怎么办?

谢谢。

3 个答案:

答案 0 :(得分:1)

您是否考虑过用UIWebView替换TextView,只是执行loadHTMLString函数?

这样当您点击链接时,它会立即打开吗?您甚至可以拥有一个UIWebView委托,并在按下链接时执行您想要的操作(自定义UIWebView而不是在Safari中自动打开等)

答案 1 :(得分:0)

查找并删除双击手势识别器

目标C

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
  if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) 
  {
     [(UITapGestureRecognizer *)gestureRecognizer setNumberOfTapsRequired:1];
     gestureRecognizer.enabled = NO;
  }
}

<强>夫特

func addGestureRecognizer(gestureRecognizer: UIGestureRecognizer)
{
    if gestureRecognizer.isKindOfClass(UITapGestureRecognizer)
    {
       (gestureRecognizer as! UITapGestureRecognizer).numberOfTapsRequired = 1
       gestureRecognizer.enabled = false
    }

}

答案 2 :(得分:0)

您可以处理点击事件..通过此代码 tapGesture.numberOfTapsRequired = 1

OR

为此,您需要在UITableViewCell中嵌入一个。但是没有必要创建自定义单元格。以下是您想要做的基本想法:

- (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];
        UITextView *comment = [[UITextView alloc] initWithFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, tableView.rowHeight)];
        comment.editable = NO;
        comment.delegate = self;
        [cell.contentView addSubview:comment];
        [comment release];
    }
    return cell;
}

如果您不想要单元格附带的标准44pt高度,您当然需要设置rowHeight。如果你想要实际的单元格,你需要添加自己的逻辑,这样只有你想要的单元格才是textView,但这是基本的想法。其余的是你自己定制适合你的配件。希望这有帮助

编辑:要绕过textView进入您的单元格,有两种方法可以解决这个问题。

1)你可以创建一个自定义的textView类并覆盖touchesBegan将消息发送到super:

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

这会将触摸事件发送到其superview,这将是你的tableView。考虑到你不想制作自定义UITableViewCells,我想你可能也不想制作自定义的textView类。这导致我选择二。

2)创建textView时,删除comment.editable = NO;。我们需要保持它可编辑,但会在委托方法中修复它。

在您的代码中,您需要插入一个textView委托方法,我们将从那里完成所有工作:

编辑:更改此代码以与UITableViewController一起使用

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
// this method is called every time you touch in the textView, provided it's editable;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:textView.superview.superview];
    // i know that looks a bit obscure, but calling superview the first time finds the contentView of your cell;
    //  calling it the second time returns the cell it's held in, which we can retrieve an index path from;

    // this is the edited part;
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    // this programmatically selects the cell you've called behind the textView;


    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    // this selects the cell under the textView;
    return NO;  // specifies you don't want to edit the textView;
}

如果那不是您想要的,请告诉我们,我们会让您整理出来