ios iphone uitextfield uitextposition uitextrange

ios - Posición del cursor de control en UITextField



iphone uitextposition (7)

Útil para posicionarse 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) }

Tengo un UITextField que estoy forzando el formateo 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 molesto. Si el usuario mueve el cursor en otro lugar que no sea el final de la cadena, entonces 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 centro del campo de texto. ¿Hay alguna forma de recordar y luego restablecer la posición del cursor en el UITextField ?


¡Finalmente he encontrado una solución para este problema! 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]

Encontré la solución en el blog de esta persona:

La funcionalidad de pegado es específica de OS V3.0, pero la he probado y funciona bien con un teclado personalizado.

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


Aquí está la versión Swift de @Chris R. - actualizada 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) }


Aquí hay un fragmento que funciona bien para este problema:

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

Fuente de @omz


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

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

Aquí hay una función que toma un rango y selecciona los textos en ese rango. Si solo desea colocar el cursor en un determinado índice, solo use un rango con 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 la input UITextField:

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


No creo que haya una manera de colocar el cursor en un lugar en particular en tu UITextField (a menos que tengas un evento táctil muy complicado y simulado). En su lugar, manejaría el formato cuando el usuario haya terminado de editar su texto (en textFieldShouldEndEditing: y si su entrada es incorrecta, no permita que el campo de texto finalice la edición.


Siéntase libre de usar esta categoría de 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