10

我整个早上都在寻找解决方案,但还没有找到可行的方法。

我有一个文本视图,其中包含一些现有的固定文本,我不希望用户能够修改。在这种情况下,我的每个文本视图都以“1.”、“2.”等开头。想法是他们输入的文本将为我稍后要做的事情编号。

我不希望用户能够删除此文本(它本质上是“永久的”)。我也不想让他们开始在这个前置文本的中间添加文本。

为了处理这个问题,我做了:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{
    if (range.location < 3) return NO;

    return YES;
}

这很好用,除了如果用户触摸视图的“1.”、“2.”等部分中的任何位置,它会将光标设置在那里,然后由于范围位置而阻止用户输入文本查看。在这种情况下,我想做的是将光标(可能在 textViewDidBeginEditing 中)设置到视图中文本的末尾。但是,无论我使用什么 selectedRange 组合,我都无法让该死的光标移动到最后。任何帮助将不胜感激。

4

6 回答 6

12

将光标移动到末尾

textView.selectedRange = NSMakeRange([textView.text length], 0);

或将光标移动到第三个字符之后

textView.selectedRange = NSMakeRange(3, 0);

另一种可能更好的方法可能是在用户开始编辑时清除前三个字符,然后在编辑结束后将它们重新添加。

于 2012-05-25T15:18:30.620 回答
10

已经很晚了,但我在一些博客中找到了可行的解决方案。它需要一点技巧

- (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);
}
于 2015-06-09T08:44:01.357 回答
5

您可以考虑注册到UIKeyboardWillShowNotification并在收到通知后将 textview 设置userInteractionEnabledNO.

此外,以 if等于字符串shouldChangeTextInRange的方式实现该方法,您不更改文本(意味着用户正在点击退格键)。当用户完成文本编辑后恢复用户交互,然后就可以了。replacementText@""@""

祝你好运!

于 2012-05-25T15:12:00.810 回答
3

我试图制作一个货币字段。我不希望用户按整个字段并可能删除格式化文本。我发现将光标保持在末尾的最简单方法是在 UITextField 的子类中执行以下操作

-(void) setSelectedTextRange:(UITextRange *)selectedTextRange{

    [super setSelectedTextRange:selectedTextRange];
    self.text = self.text;
}
于 2013-07-27T22:10:42.190 回答
1
extension UITextView {
    func moveCoursoreToEnd(){
        selectedTextRange = textRange(from:endOfDocument, to: endOfDocument)
    }
}
于 2020-12-16T18:33:28.530 回答
0

此方法隐藏自动更正和键盘不跳转。

- (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];
        }
    }
}
于 2015-04-07T09:41:31.677 回答