将UITextView光标位置设置为文本结尾

时间:2012-05-25 15:04:56

标签: ios uitextview

我整个上午都在寻找解决方案,但尚未找到有效的方法。

我有一个文本视图,其中包含一些我不希望用户能够修改的现有固定文本。在这种情况下,我的每个文本视图都以“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游标移动到最后。任何帮助将不胜感激。

6 个答案:

答案 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>