ios swift uitextfield uitextview uitextposition

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

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