Установка положения курсора 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];
}
}
}