Controlar la position del cursor en UITextField

Tengo un UITextField que estoy obligando a formatear modificando el text dentro del controller de notificación de cambios. Esto funciona muy bien (una vez que resolví los problemas de reinput) pero me deja con un problema más molesto. Si el usuario mueve el cursor a un lugar que no sea el final de la cadena, mi cambio de formatting lo mueve al final de la cadena. Esto significa que los usuarios no pueden insert más de un carácter a la vez en el medio del campo de text. ¿Hay alguna forma de recordar y luego restablecer la position del cursor en UITextField ?

    Controlar la position del cursor en un UITextField es complicado porque hay muchas abstracciones involucradas con los cuadros de input y las posiciones de cálculo. Sin embargo, es ciertamente posible. Puede usar la function miembro setSelectedTextRange :

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

    Aquí hay una function que toma un range y selecciona los texts en ese range. Si solo desea colocar el cursor en un cierto índice, simplemente use un range 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)]; 

    ¡Finalmente encontré una solución para este problema! Puede colocar el text que necesita insertado en el sistema de cartón y luego pegarlo en la position actual del cursor:

     [myTextField paste:self] 

    Encontré 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 pegado es específica de OS V3.0, pero la he probado y funciona bien para mí con un keyboard personalizado.

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

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

    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) } 

    No creo que exista una manera de ubicar el cursor en un lugar particular en tu UITextField (a less que tengas un evento touch muy simulado y simulado). En cambio, manejaba el formatting cuando el usuario había terminado de editar su text (en textFieldShouldEndEditing: y si su input es incorrecta, no permita que el campo de text termine de editarse.

    Siéntase libre de usar esta categoría UITextField para get y establecer la position 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 

    Aquí hay un fragment 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