2016-01-21 12 views
43

Eksperymentowałem z UITextField i jak pracować z jego pozycją kursora. Znalazłem szereg relacji odpowiedzi Objective-C, jak wUzyskiwanie i ustawianie pozycji kursora UITextField i UITextView w Swift

Ale ponieważ pracuję z Swift, chciałem się nauczyć pobierz bieżącą lokalizację kursora, a także ustaw ją w Swift.

Poniższa odpowiedź jest wynikiem mojego eksperymentowania i tłumaczenia z Objective-C.

Odpowiedz

136

Ta odpowiedź została zaktualizowana do Swift 3

Poniższa treść dotyczy zarówno UITextField i UITextView.

Przydatne informacje

Prapoczątki tekstu pola tekstowego:

let startPosition: UITextPosition = textField.beginningOfDocument 

samym końcu tekstu pola tekstowego:

let endPosition: UITextPosition = textField.endOfDocument 

Aktualnie wybrany zakres:

let selectedRange: UITextRange? = textField.selectedTextRange 

Get pozycji kursora

if let selectedRange = textField.selectedTextRange { 

    let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start) 

    print("\(cursorPosition)") 
} 

pozycję Ustaw kursor

W celu ustalenia pozycji, wszystkie te metody są rzeczywiście ustawienie szeregu z takimi samymi wartościami początkowymi i końcowymi.

Do początku

let newPosition = textField.beginningOfDocument 
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) 

Do końca

let newPosition = textField.endOfDocument 
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) 

Do jednej pozycji na lewo od bieżącej pozycji kursora

// only if there is a currently selected range 
if let selectedRange = textField.selectedTextRange { 

    // and only if the new position is valid 
    if let newPosition = textField.position(from: selectedRange.start, offset: -1) { 

     // set the new position 
     textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) 
    } 
} 

Na dowolne stanowisko

Zacznij od początku i przesuń 5 znaków w prawo.

let arbitraryValue: Int = 5 
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) { 

    textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition) 
} 

pokrewne

Zaznacz cały tekst

textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument) 

Wybierz zakres tekstu

// Range: 3 to 7 
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3) 
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7) 

if startPosition != nil && endPosition != nil { 
    textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!) 
} 

Wstaw tekst na obecnym kursora positio n

textField.insertText("Hello") 

Uwagi

  • Zastosowanie textField.becomeFirstResponder() dać skupienie pola tekstowego i uczynić pojawi się klawiatura.

  • Aby uzyskać tekst w pewnym zakresie, patrz: this answer.

Zobacz także

+0

Jaki jest cel startPosition? Co możesz z tym zrobić? Jaki jest cel, który może być potrzebny do uzyskania pozycji kursora? – Honey

+1

@ Kochanie, użyłem tej nazwy zmiennej, aby odnieść się do dwóch różnych rzeczy tutaj. Pierwsza miała odnosić się do początku pola tekstowego. Byłoby użyteczne, gdybyś chciał tam przenieść kursor. Drugim było odwołanie się do początku wybranego zakresu tekstu. Jest to przydatne, jeśli chcesz skopiować ten zakres lub ustawić na nim jakiś atrybut. – Suragch

+0

Czy jest coś, aby przesunąć kursor w prawo, gdy pole tekstowe jest puste? Poszłam za twoją odpowiedzią, ale nie mogłam tego zrobić. –

2

w moim przypadku musiałem użyć DispatchQueue:

func textViewDidBeginEditing(_ textView: UITextView) { 

    DispatchQueue.main.async{ 
     textField.selectedTextRange = ... 
    } 
} 

nic z tego i innych wątków pracował.

PS: Sprawdziłem dokładnie, w którym wątku uruchomiono textViewDidBeginEditing, i był to główny wątek, ponieważ powinien działać cały UI, więc nie wiem, dlaczego działało to małe opóźnienie przy użyciu main.asynch.

Powiązane problemy