UITextView 双击编辑
Posted
技术标签:
【中文标题】UITextView 双击编辑【英文标题】:UITextView double tap to edit 【发布时间】:2013-07-13 15:53:52 【问题描述】:所以我有一个 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,如果是,我会改变什么?
【问题讨论】:
【参考方案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
【讨论】:
【参考方案2】:Sublassing 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];
【讨论】:
【参考方案3】:您应该将手势识别器的目标设置为文本字段。
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:textField action:@selector(doubleTap:)];
【讨论】:
您能详细说明一下吗?我不确定我会怎么做。 错误。这样做是说文本字段有一个名为“doubleTap”的方法,除非您将文本字段子类化为实际拥有此方法,否则您将遇到无法识别的选择器实例错误以上是关于UITextView 双击编辑的主要内容,如果未能解决你的问题,请参考以下文章