Установка положения курсора 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 я использую, я просто не могу заставить проклятый курсор двигаться до конца. Любая помощь будет очень признательна.

5 ответов


вы можете рассмотреть возможность регистрации в UIKeyboardWillShowNotification и после получения уведомления установите textview userInteractionEnabled to NO.

кроме того, использовать тег shouldChangeTextInRange метод таким образом, что если replacementText равна строке @"" вы не меняете текст (@"" означает, что пользователь нажимает backspace). Восстановите взаимодействие с пользователем, когда пользователь закончит редактирование текста, и вы пойдете.

удачи!


для перемещения курсора в конец

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

или переместить курсор после третьего символа

textView.selectedRange = NSMakeRange(3, 0);

другой, возможно, лучший подход может заключаться в том, чтобы очистить первые три символа, когда пользователь начинает редактирование, а затем добавить их обратно после завершения редактирования.


уже поздно, но я нашел рабочее решение для этого в каком-то блоге . это нужно немного взломать

- (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);
}

Я пытался создать поле валюты. Я не хотел, чтобы пользователь нажимал по всему полю и потенциально удалял форматированный текст. Самый простой способ сохранить курсор в конце-сделать следующее в подклассе UITextField

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

    [super setSelectedTextRange:selectedTextRange];
    self.text = self.text;
}

этот метод скрывает автоисправление и клавиатуру не прыгать.

- (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];
        }
    }
}