2012-05-25 8 views
6

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

+0

Еще проще будет поместить ваши номера в ярлыке прямо против вашего текстового вида, чтобы они выглядели так, как будто они являются частью того же предложения. Тогда они смогут изменить только соответствующую часть. – lnafziger

ответ

4

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

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

Удачи вам!

+0

Кажется, это был лучший способ сделать это. Какой-то глупость, что диапазон настройки, похоже, не работает. – Jason

10

Чтобы переместить курсор в конец

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

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

textView.selectedRange = NSMakeRange(3, 0); 

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

+0

Это именно то, что я пытался сделать. Однако кажется, что независимо от того, установлен ли я выбраннымRange, курсор всегда ставит себя там, где был затронут вид. Ну, он поместит курсор где-нибудь в середине текста, если пользователь коснется места, где есть текст, иначе он поместит курсор в конец, если пользователь коснется пустой области. Похоже, в конце есть дополнительный шаг, который переопределяет диапазон с сенсорным расположением. – Jason

+0

проверить мой ответ [здесь] (http://stackoverflow.com/questions/8891072/how-to-set-the-position-of-the-cursor-in-ititeview) с участием 'performSelector: withObject: afterDelay' Я знаю, что это поздно, но ... независимо от того, HTH – Cashew

3

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

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

    [super setSelectedTextRange:selectedTextRange]; 
    self.text = self.text; 
} 
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]; 
     } 
    } 
} 
6

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

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