1

所以我有一个 UITextView 用来制作可移动、可编辑的标签(我之前对 SO 的搜索表明这显然是最好的选择)。我需要让用户双击以启用编辑并将其设置为第一响应者。我找不到这样做的方法,而且我所有的其他搜索都出现了过时的答案或模糊的答案。我尝试过的任何方法似乎都不起作用。我尝试使用UITextViewDelegate开始编辑,而不是使用 选择文本textViewDidChangeSelection:,但在您更改当前选择之前它不起作用。我也尝试使用UITapGestureRecognizer这样的自定义:

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[doubleTap setNumberOfTouchesRequired:1];
[newLabel addGestureRecognizer:doubleTap];

-(void)doubleTap:(UITapGestureRecognizer *)sender
{
    NSLog(@"Double tap detected");
    NSLog(@"Sender view of class %@", [[sender view] class]);
    UITextView *tappedView = (UITextView *)[sender view];
    [tappedView setEditable:YES];
    [tappedView becomeFirstResponder];
//    [tappedView setEditable:NO];
}

双击手势永远不会被调用。我不确定为什么。奇怪的是,它也不会选择文本。它似乎只是打破了双击手势。有没有办法摆脱标准的双击选择手势,或者修改它?我应该继承 UITextView,如果是,我会改变什么?

4

3 回答 3

1

我找到了一个简洁的解决方案,代码更少(Swift 4.2):

创建一个自定义 UITextView 类并在其中写下这个

    override var canBecomeFirstResponder: Bool {
    if self.isEditable {
        return true
    } else {
        self.isEditable = true
        return false
    }

然后在 viewDidLoad() 中写入以下内容(或在情节提要编辑器的行为下取消选择“可编辑”)

myTextView.isEditable = false

然后,当您完成编辑文本时,只需将相同的代码放在某处 - 例如。textViewDidEndEditing(_ textView: UITextView)

myTextView.isEditable = false

当视图加载时,textView 不可编辑,所有数据检测器都工作。然后第二次点击允许对其进行编辑(并禁用数据检测器)。

退出 textView 后,它会再次设置为不可编辑,并且数据检测器会工作。

所有这一切都没有任何手势识别器!:-D

于 2019-01-26T07:12:49.823 回答
0

子类化 UITextView,我将此方法添加到.m文件中。

-(BOOL)canBecomeFirstResponder
{
    if (self.editable == YES){
        return YES;
    }
    else{
    return NO;
    }
}

除此之外,我还使用了

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGesture
{
    return YES;
}

这是我发现解决问题的最佳方法。我只想允许双击进行编辑。在双击之前,我不希望发生文本选择、滚动等。要进一步完成此操作,您需要使用 aUITextViewDelegate来转动textView.editable = NO

-(void)textViewDidEndEditing:(UITextView *)textView
{
    [textView setEditable:NO];
}
于 2013-07-14T20:15:49.747 回答
-2

您应该将手势识别器的目标设置为文本字段。

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:textField action:@selector(doubleTap:)];
于 2013-07-13T16:53:26.553 回答