ios - Obtención y configuración de la posición del cursor de UITextField y UITextView en Swift
uitextposition (4)
He estado experimentando con
UITextField
y cómo trabajar con su posición del cursor.
He encontrado una serie de respuestas de Objective-C, como en
- Obtener la posición del cursor de UITextField en ios
- Controlar la posición del cursor en UITextField
- UITextField recibe la palabra actualmente editada
Pero como estoy trabajando con Swift, quería aprender cómo obtener la ubicación actual del cursor y también configurarlo en Swift.
La respuesta a continuación es el resultado de mi experimentación y traducción de Objective-C.
El siguiente contenido se aplica tanto a
UITextField
como a
UITextView
.
Información útil
El comienzo del texto del campo de texto:
let startPosition: UITextPosition = textField.beginningOfDocument
El final del texto del campo de texto:
let endPosition: UITextPosition = textField.endOfDocument
El rango seleccionado actualmente:
let selectedRange: UITextRange? = textField.selectedTextRange
Obtener posición del cursor
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
print("/(cursorPosition)")
}
Establecer la posición del cursor
Para establecer la posición, todos estos métodos están configurando un rango con los mismos valores iniciales y finales.
Al Principio
let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
Hasta el final
let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
A una posición a la izquierda de la posición actual del cursor
// 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)
}
}
A una posición arbitraria
Comience desde el principio y mueva 5 caracteres a la derecha.
let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
Relacionado
Seleccionar todo el texto
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
Seleccione un rango de texto
// 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!)
}
Insertar texto en la posición actual del cursor
textField.insertText("Hello")
Notas
-
Use
textField.becomeFirstResponder()
para enfocar el campo de texto y hacer que aparezca el teclado. -
Vea esta respuesta para saber cómo obtener el texto en algún rango.
Ver también
- Cómo crear un rango en Swift
Para establecer la posición del cursor en su punto:
textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))
Para restablecer la posición del cursor:
textView.endFloatingCursor()
Nota : Este ejemplo funciona en Textview y Textfield.
en mi caso tuve que usar DispatchQueue:
func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async{
textField.selectedTextRange = ...
}
}
nada más de este y otros hilos funcionó.
PD: Verifiqué dos veces en qué hilo se estaba ejecutando textViewDidBeginEditing, y era el hilo principal, ya que toda la interfaz de usuario debería ejecutarse, así que no estoy seguro de por qué funcionó esa pequeña demora al usar main.asynch.
let range = field.selectedTextRange
field.text = "hello world"
field.selectedTextRange = range