2012-05-25 14 views
6

Szukałem rozwiązania tego przez cały ranek, ale muszę jeszcze znaleźć coś, co działa.Ustawienia UITextWyświetl położenie kursora na końcu tekstu

Mam widok tekstowy, w którym znajduje się jakiś stały tekst, którego nie chcę, aby użytkownik mógł modyfikować. W takim przypadku każdy z moich widoków tekstowych zaczyna się od "1.", "2." itp. Pomysł polega na tym, że wpisany tekst będzie ponumerowany za coś, co robię później.

Nie chcę, aby użytkownik mógł usunąć ten tekst (zasadniczo jest "stały"). Nie chcę również pozwolić im na dodawanie tekstu w środku tego wstępnego tekstu.

W tym poradzić, mam zrobić:

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

    return YES; 
} 

Działa to doskonale, z wyjątkiem, że jeśli użytkownik dotyka nigdzie w moim „1”, „2”, itd części widzenia, ustawi tam kursor, co uniemożliwi użytkownikowi wpisywanie tekstu z powodu sprawdzenia lokalizacji zasięgu. W tym przypadku chcę ustawić kursor (być może w textViewDidBeginEditing) na końcu tekstu w widoku. Jednak niezależnie od tego, z jakiej kombinacji wybranego parametru korzystam, po prostu nie mogę ustawić kursora na końcu. Każda pomoc będzie bardzo ceniona.

+0

Jeszcze prostszym sposobem byłoby umieszczenie twoich numerów na etykiecie tuż przed twoim widokiem tekstu tak, aby wyglądały jak część tego samego zdania. Wtedy będą mogli zmienić tylko odpowiednią część. – lnafziger

Odpowiedz

4

Można rozważyć zarejestrowanie się pod numerem UIKeyboardWillShowNotification, a po otrzymaniu powiadomienia ustaw tekstowy widok userInteractionEnabled na NO.

Ponadto, wdrożenie metody shouldChangeTextInRange w taki sposób, że jeśli replacementText jest równy ciąg @"" nie zmienić tekst (@"" co oznacza, że ​​użytkownik jest naciśnięcie klawisza backspace). Przywróć interakcję użytkownika, gdy użytkownik zakończy edycję tekstu i gotowe.

Powodzenia!

+0

To wydaje się być najlepszym sposobem na zrobienie tego. Trochę głupio, że zakres ustawień nie działa. – Jason

10

Aby przesunąć kursor na koniec

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

lub, aby przesunąć kursor po trzecim znaku

textView.selectedRange = NSMakeRange(3, 0); 

Innym, może lepiej, podejście może być, aby wyczyścić trzy pierwsze znaki z gdy użytkownik rozpocznie edycję, a następnie dodaj je z powrotem po zakończeniu edycji.

+0

To jest dokładnie to, co próbowałem zrobić. Jednak wydaje się, że niezależnie od tego, czy ustawię selectedRange, kursor zawsze umieszcza się tam, gdzie został dotknięty widok. Cóż, umieści kursor gdzieś pośrodku tekstu, jeśli użytkownik dotknie miejsca, w którym jest tekst, w przeciwnym razie ustawi kursor na końcu, jeśli użytkownik dotknie pustego obszaru. Wygląda na to, że na końcu jest dodatkowy krok, który nadpisuje zakres z lokalizacją dotyku. – Jason

+0

sprawdź moją odpowiedź [tutaj] (http://stackoverflow.com/questions/8891072/how-to-set-tosition-of-the-cursor-in-uitextview) z udziałem 'performSelector: withObject: afterDelay' Wiem, że jest późno, ale ... jakikolwiek HTH – Cashew

3

Próbowałem zrobić pole waluty. Nie chciałem, aby użytkownik naciskał na całe pole i potencjalnie usuwał sformatowany tekst. Najprostszym sposobem znalazłem utrzymać kursor na końcu jest zrobić następujące w podklasie UITextField

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

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

Ta metoda ukryj autokorekty & klawiatura nie skakać.

- (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

Jest późno, ale znalazłem rozwiązanie do tego celu na blogu. potrzebuje trochę hackowania:

- (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); 
} 
Powiązane problemy