Pobieranie i ustawianie pozycji kursora UITextField i UITextView w języku Swift

Eksperymentowałem z UITextField i jak pracować z jego pozycją kursora. Znalazłem kilka odpowiedzi Objective-C, jak w

Ale ponieważ pracuję z Swift, chciałem dowiedzieć się, jak uzyskać bieżącą lokalizację kursora, a także ustawić ją w Swift.

ODPOWIEDŹ poniżej jest wynik moich eksperymentów i tłumaczenia z Objective-C.

Author: Community, 2016-01-21

2 answers

Ta odpowiedź została zaktualizowana dla Swift 3

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

Przydatne informacje

Na samym początku pola tekstowego tekst:

let startPosition: UITextPosition = textField.beginningOfDocument

Na samym końcu pola tekstowego tekst:

let endPosition: UITextPosition = textField.endOfDocument

Aktualnie wybrany zakres:

let selectedRange: UITextRange? = textField.selectedTextRange

Get cursor position

if let selectedRange = textField.selectedTextRange {

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

    print("\(cursorPosition)")
}

Ustaw pozycję kursora

Aby ustawić pozycję, Wszystkie te metody ustawiają zakres z tymi 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)
    }
}

Do dowolnej pozycji

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

Powiązane

Wybierz 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!)
}

Insert tekst w bieżącej pozycji kursora

textField.insertText("Hello")

Uwagi

  • Użyj textField.becomeFirstResponder(), aby nadać fokus polowi tekstowemu i sprawić, że pojawi się klawiatura.

  • Zobacz ta odpowiedź , aby dowiedzieć się, jak uzyskać tekst w pewnym zakresie.

Zobacz też

 184
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 09:01:37

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

func textViewDidBeginEditing(_ textView: UITextView) {

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

Nic innego z tego i innych wątków nie działało.

PS: dwukrotnie sprawdziłem, na którym wątku działa textViewDidBeginEditing i był to główny wątek, ponieważ wszystkie UI powinny działać, więc nie wiem, dlaczego to małe opóźnienie przy użyciu main.asynch zadziałał.

 10
Author: Michael Ros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-23 23:52:59