所以我有一个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,如果是,我会改变什么?
答案 0 :(得分: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
答案 1 :(得分:0)
对UITextView进行子类化,我将此方法添加到.m
文件中。
-(BOOL)canBecomeFirstResponder
{
if (self.editable == YES){
return YES;
}
else{
return NO;
}
}
除此之外,我还使用了
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGesture
{
return YES;
}
这是我找到解决问题的最好方法。我只想允许双击进行编辑。我希望在双击之前不会选择文本,滚动等。要进一步完成此操作,您需要使用UITextViewDelegate
转textView.editable = NO
-(void)textViewDidEndEditing:(UITextView *)textView
{
[textView setEditable:NO];
}
答案 2 :(得分:-2)
您应该将手势识别器的目标设置为文本字段。
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:textField action:@selector(doubleTap:)];