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
- pobieranie pozycji kursora UITextField w systemie ios
- kontrola pozycji kursora w UITextField
- UITextField get currently edited word
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.
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ż
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ł.
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