我整个上午都在寻找解决方案,但尚未找到有效的方法。
我有一个文本视图,其中包含一些我不希望用户能够修改的现有固定文本。在这种情况下,我的每个文本视图都以“1”,“2。”等开头。这个想法是他们输入的文本将被编号为我稍后要做的事情。
我不希望用户能够删除此文本(它基本上是“永久的”)。我也不想让他们在这个前文本的中间开始添加文本。
为了解决这个问题,我做了:
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (range.location < 3) return NO;
return YES;
}
这很好用,除非用户触摸视图中“1.”,“2。”等部分的任何地方,它会将光标设置在那里,这会阻止用户输入文字,因为范围位置检查。在这种情况下我想要做的是将光标(可能在textViewDidBeginEditing中)设置为视图中文本的末尾。但是,无论我使用的selectedRange是什么组合,我都无法让darn游标移动到最后。任何帮助将不胜感激。
答案 0 :(得分:11)
将光标移动到结尾
textView.selectedRange = NSMakeRange([textView.text length], 0);
或将光标移动到第三个字符
之后textView.selectedRange = NSMakeRange(3, 0);
另一种可能更好的方法可能是在用户开始编辑时清除前三个字符,然后在编辑完成后将其添加回来。
答案 1 :(得分:8)
现在已经很晚了,但我在一些博客中找到了解决方案。它需要一点点破解
- (void) textViewDidBeginEditing:(UITextView*)textview
{
[self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01];
}
- (void)placeCursorAtEnd:(UITextView *)textview
{
NSUInteger length = textview.text.length;
textview.selectedRange = NSMakeRange(length, 0);
}
答案 2 :(得分:5)
您可以考虑注册UIKeyboardWillShowNotification
,并在收到通知后,将文字视图的userInteractionEnabled
设置为NO
。
此外,实施shouldChangeTextInRange
方法,如果replacementText
等于字符串@""
,则不更改文本(@""
表示用户是点击退格)。当用户完成编辑文本后,您可以恢复用户交互。
答案 3 :(得分:3)
我试图创造一个货币领域。我不希望用户按下整个字段并可能删除格式化文本。我发现将光标保持在最后的最简单方法是在UITextField的子类中执行以下操作
-(void) setSelectedTextRange:(UITextRange *)selectedTextRange{
[super setSelectedTextRange:selectedTextRange];
self.text = self.text;
}
答案 4 :(得分:0)
此方法隐藏自动更正&amp;键盘不跳。
- (void)rejectAutoCorrectSuggestionInTextView:(UITextView *)textView
{
if ([textView isFirstResponder])
{
NSString *original = textView.text;
NSRange originalRange = textView.selectedRange;
CGPoint originalOffset = textView.contentOffset;
[UIView animateWithDuration:.00001 animations:^{
textView.text = [textView.text stringByAppendingString:@"|"];
NSRange range;
range.location = textView.text.length-1;
range.length = 0;
textView.selectedRange = range;
textView.text = [textView.text substringToIndex:textView.text.length - 1];
}];
NSString *final = textView.text;
if (![original isEqualToString:final])
{
textView.text = original;
textView.selectedRange = originalRange;
[textView setContentOffset:originalOffset animated:NO];
}
}
}
答案 5 :(得分:0)
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<div class="card card-sm border-0" id="localcard">
<p> See, no Border! </p>
</div>