2009-09-30 25 views
45

Tengo un UITextField que estoy forzando a formatear modificando el texto dentro del controlador de notificación de cambios. Esto funciona muy bien (una vez que resolví los problemas de reentrada) pero me deja con un problema más persistente. Si el usuario mueve el cursor a otro lugar que no sea el final de la cadena, mi cambio de formato lo mueve al final de la cadena. Esto significa que los usuarios no pueden insertar más de un carácter a la vez en el medio del campo de texto. ¿Hay alguna manera de recordar y restablecer la posición del cursor en el UITextField?Posición del cursor de control en UITextField

+3

Respuesta rápida sobre cómo obtener y establecer la posición del cursor e insertar texto. http://stackoverflow.com/a/34922332/3681880 – Suragch

Respuesta

0

No creo que haya una manera de colocar el cursor en un lugar en particular en su UITextField (a menos que sea muy complicado y simule un evento táctil). En cambio, manejaría el formateo cuando el usuario tenga terminado editando su texto (en textFieldShouldEndEditing:) y si su entrada es incorrecta, no permita que el campo de texto termine de editarse.

+3

Lo había considerado pero lo que estoy implementando es similar a la forma en que ingresas los números en un cajero automático. El decimal siempre está allí y mientras tecleas los números, se mueven hacia la izquierda, por lo que ingresar 1-0-5-0 resulta primero en 0.01, luego en 0.10, 1.05, 10.50. Hacerlo al final permitiría 1050 en el campo y luego cambiarlo a 10.50, lo cual es bastante confuso para el usuario. – Jeremy

3

¡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.

Si elige esta solución, probablemente debería guardar los contenidos existentes del portapapeles del usuario y restaurarlos inmediatamente después.

+1

Esta debería ser la respuesta aceptada. – banDedo

+13

¿Modificar el portapapeles del usuario? Eso parece algo que me volvería loco. ¿Puedes restaurar el portapapeles cuando hayas terminado con él? – colinta

64

Controlar la posición del cursor en un UITextField es complicado porque se involucran tantas abstracciones con los cuadros de entrada y las posiciones de cálculo. Sin embargo, es ciertamente posible. Puede utilizar la función miembro setSelectedTextRange:

[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]]; 

Aquí es una función que toma un rango y selecciona los textos en ese rango. Si lo que desea es colocar el cursor en un determinado índice, sólo tiene que utilizar una gama de longitud 0:

+ (void)selectTextForInput:(UITextField *)input atRange:(NSRange)range { 
    UITextPosition *start = [input positionFromPosition:[input beginningOfDocument] 
               offset:range.location]; 
    UITextPosition *end = [input positionFromPosition:start 
               offset:range.length]; 
    [input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]]; 
} 

Por ejemplo, para colocar el cursor en idx en el UITextField input:

[Helpers selectTextForInput:input 
         atRange:NSMakeRange(idx, 0)]; 
+0

Bien hecho. esto funciona para mí y es flexible. – LostInTheTrees

+0

La idea general está bien, pero este código quiere residir en una categoría en NSTextField, como aquí: https://github.com/MaxZeng/UITextField-SelectedRange/blob/master/UITextFieldSelectedRange/UITextField%2BSelection.m – osxdirk

+1

Lo siento pero no funciona, el cursor se queda al final ... iOS 8.0 aquí. –

-2

Aquí es un fragmento de código que funciona bien para este problema:

- (void)textFieldDidBeginEditing:(UITextField *)textField{ 
    UITextPosition *positionBeginning = [textField beginningOfDocument]; 
    UITextRange *textRange =[textField textRangeFromPosition:positionBeginning 
                toPosition:positionBeginning]; 
    [textField setSelectedTextRange:textRange]; 
} 

Source from @omz

2

Aquí está la versión Swift de @Chris R.- actualizado para Swift3

private func selectTextForInput(input: UITextField, range: NSRange) { 
    let start: UITextPosition = input.position(from: input.beginningOfDocument, offset: range.location)! 
    let end: UITextPosition = input.position(from: start, offset: range.length)! 
    input.selectedTextRange = input.textRange(from: start, to: end) 
} 
0

dude en utilizar esta categoría UITextField para obtener y establecer la posición del cursor:

@interface UITextField (CursorPosition) 

@property (nonatomic) NSInteger cursorPosition; 

@end 

-

@implementation UITextField (CursorPosition) 

- (NSInteger)cursorPosition 
{ 
    UITextRange *selectedRange = self.selectedTextRange; 
    UITextPosition *textPosition = selectedRange.start; 
    return [self offsetFromPosition:self.beginningOfDocument toPosition:textPosition]; 
} 

- (void)setCursorPosition:(NSInteger)position 
{ 
    UITextPosition *textPosition = [self positionFromPosition:self.beginningOfDocument offset:position]; 
    [self setSelectedTextRange:[self textRangeFromPosition:textPosition toPosition:textPosition]]; 
} 

@end 
4

Útil a la posición en el índice (Swift 3)

private func setCursorPosition(input: UITextField, position: Int) { 
    let position = input.position(from: input.beginningOfDocument, offset: position)! 
    input.selectedTextRange = input.textRange(from: position, to: position) 
} 
Cuestiones relacionadas