2009-08-23 14 views
12

Tengo unos UITextFields en una UITableView. El usuario debería poder insertar solo números y puntos. Para hacer esto, configuré el tipo de teclado en UIKeyboardTypeNumberPad y agregué un botón '.'- en la esquina inferior izquierda. Cada vez que se presiona el botón, se llama a una función. Esta función debe insertar un punto en la posición actual del cursor, pero este es el problema: UITextField no tiene una propiedad selectedRange, por lo que no puedo obtener la posición actual del cursor. ¿Alguien sabe cómo resolver este problema o hay alguna otra forma de hacerlo? Gracias.Insertar cadena en la posición del cursor de UITextField

Respuesta

33

¡Finalmente he encontrado una solución para este problema! Se puede poner el texto que necesita insertado en la mesa de trabajo del sistema y luego pegarlo en la posición actual del cursor:

[myTextField paste:self] 

he encontrado la solución en el blog de esta persona:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

La funcionalidad de pasta es OS V3.0 específico, pero lo he probado y funciona bien para mí con un teclado personalizado.

Actualización: Según el comentario de Jasarien a continuación, es una buena práctica guardar primero los contenidos del portapapeles y restaurarlos después. Para mayor comodidad, aquí está mi código:

// Get a reference to the system pasteboard 
    UIPasteboard* lPasteBoard = [UIPasteboard generalPasteboard]; 

    // Save the current pasteboard contents so we can restore them later 
    NSArray* lPasteBoardItems = [lPasteBoard.items copy]; 

    // Update the system pasteboard with my string 
    lPasteBoard.string = @"-"; 

    // Paste the pasteboard contents at current cursor location 
    [myUIField paste:self]; 

    // Restore original pasteboard contents 
    lPasteBoard.items = lPasteBoardItems; 

    [lPasteBoardItems release]; 
+0

Esto es lo que realmente hizo la pregunta. Y, y excelente solución. – oberbaum

+5

Esta es una gran solución. Sin embargo, puede valer la pena mencionar aquí que debe guardar los contenidos del portapapeles del usuario antes de poner sus contenidos en el portapapeles y luego restaurar los contenidos del usuario posteriormente. De esta forma, no tienen idea de que utilizaste el cartón y tu código es un buen ciudadano al no criticar el contenido de la mesa de trabajo del usuario. – Jasarien

+0

Esta solución es incompatible con VoiceOver. En lugar de decir el carácter insertado, simplemente dice "Pegar". –

0

Lea el valor del campo de texto como una cadena cuando se presiona el botón. Edite la cadena y luego establezca el valor del campo en la nueva cadena.

+0

Sí, pero el punto es que él no sabe cómo quiere modificar la cadena. él quiere insertar un punto donde está el cursor, pero no sabe dónde está el cursor – newacct

+0

Esto no insertaría un punto en la posición actual del cursor, justo al final de la cadena. – WetFish

1

Si usted está mirando para crear campos de texto que le permiten entrar en cifras decimales puedo sugerir que usted prefiere solucionar el punto decimal a una cierta precisión y permite al usuario introducir los números de la siguiente manera:

Asumiendo que su la precisión es de 2 puntos decimales:

start: value is 0.00 
user enters 1: value is 0.01 
user enters 2: value is 0.12 
user enters 3: value is 1.23 
user enters 4: value is 12.34 

Ver What is the best way to enter numeric values with decimal points? para una solución similar para la moneda.

Es, de lejos, una solución más simple que la creación de un teclado personalizado y el tratamiento de todos los matices que presenta ese enfoque. Sin embargo, si necesita una precisión de longitud variable, entonces ese enfoque podría mejorarlo.

+0

Gracias. Creo que esta es la mejor manera. – WetFish

2

Ahora hay un fantástico teclado de tipo teclado numérico que incluye un punto decimal, sin necesidad de configuración necesarios, excepto el establecimiento (no en IB, no es una opción todavía) los UITextField 's keyboardType propiedad a UIKeyboardStyleDecimalPad, así:

textField.keyboardType = UIKeyboardTypeDecimalPad; 

Esto hace todo el materia de lujo que ha estado tratando de hacerlo automáticamente.

2

En Swift

Esto inserta texto en la posición actual del cursor.

textField.insertText("Hello") 

Mi respuesta completa sobre el trabajo con la posición del cursor es here.

Cuestiones relacionadas