2009-03-06 13 views
23

Tenemos una UITextView en nuestra aplicación de iPhone que es editable. Necesitamos insertar algo de texto en la ubicación del cursor cuando los usuarios presiona algunos botones de la barra de herramientas, pero parece que no se puede encontrar un método documentado (o no documentado) para encontrar la ubicación actual del cursor.¿Cómo obtener la posición del cursor en una UITextView en el iPhone?

¿Alguien tiene alguna idea o alguien más ha logrado algo similar?

+0

De nota es que textField.selectedRange.location no devolverá la ubicación si se solicita en textViewDidBeginEditing: textField a menos que lo obtenga después de un retraso. – Morkrom

Respuesta

8

¿Has probado UITextView.selectedRange? Devuelve NSRange, cuyo elemento de ubicación debería indicar dónde se encuentra el cursor.

30

Como dijo drewh, puede usar el rango seleccionado de UITextView para devolver el punto de inserción. La longitud de este rango es siempre cero. El siguiente ejemplo muestra cómo hacerlo.

NSString *contentsToAdd = @"some string"; 
NSRange cursorPosition = [tf selectedRange]; 
NSMutableString *tfContent = [[NSMutableString alloc] initWithString:[tf text]]; 
[tfContent insertString:contentsToAdd atIndex:cursorPosition.location]; 
[theTextField setText:tfContent]; 
[tfContent release]; 
+6

Tenga en cuenta que con iPhone 3.0, ya no es cierto que la longitud del rango sea siempre cero. Si el usuario tiene texto seleccionado, entonces la duración será distinta de cero. En este caso, es posible que desee utilizar replaceCharactersInRange: withString: en lugar de insertString :: atIndex :. También debe establecer el nuevo rango de selección de forma apropiada. –

+0

Esto es genial, pero cuando hago esto, el cursor del usuario se tira al final de UITextView. ¿Cómo puedo mantener el cursor del usuario en su lugar? – Jason

+2

Jason, pruebe tf.selectedRange = NSMakeRange (cursorPosition.location + contentsToAdd.length, 0); después de configurar el nuevo texto – demosten

10

Uso UITextView selectedRange propiedad para encontrar el punto de inserción cuando la vista del texto es el primero en responder. De lo contrario, cuando la vista no está enfocada, esta propiedad devuelve NSNotFound. Si necesita conocer la posición del cursor en ese caso, considere la subclasificación UITextView y el método canResignFirstResponder, donde puede almacenar la posición del cursor en una variable miembro.

+0

Esta es una gran información que es fácil de perder. No puedo decirte cuánto tiempo tardé en descubrir por qué la ubicación selectedRange devolvía NSNotFound. Puede verificar la ubicación no válida con: if (myTextField.selectedRange.location == NSNotFound) – memmons

+0

¡Ha resuelto mi vida! Pero ahora me pregunto, ¿para qué sirve 'selectedTextRange'? Siempre consigo el comienzo de todo el texto cuando lo uso ... –

1

Swift 4:

// lets be safe, thus if-let 
if let cursorPosition = textView.selectedTextRange?.start { 
    // cursorPosition is a UITextPosition object describing position in the text 

    // if you want to know its position in textView in points: 
    let caretPositionRect = textView.caretRect(for: cursorPosition) 
} 

simplemente Utilizamos textView.selectedTextRange a ser seleccionado rango de texto y la posición del cursor se encuentra en su posición start.

Cuestiones relacionadas