Format UITextField text without having cursor move to the end Format UITextField text without having cursor move to the end ios ios

Format UITextField text without having cursor move to the end


The way to make this work is to grab the location of the cursor, update the field contents, and then replace the cursor to its original position. I'm not sure of the exact equivalent in Swift, but the following is how I would do it in Obj-C.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{    UITextPosition *beginning = textField.beginningOfDocument;    UITextPosition *cursorLocation = [textField positionFromPosition:beginning offset:(range.location + string.length)];    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];    /* MAKE YOUR CHANGES TO THE FIELD CONTENTS AS NEEDED HERE */    // cursorLocation will be (null) if you're inputting text at the end of the string    // if already at the end, no need to change location as it will default to end anyway    if(cursorLocation)    {        // set start/end location to same spot so that nothing is highlighted        [textField setSelectedTextRange:[textField textRangeFromPosition:cursorLocation toPosition:cursorLocation]];    }    return NO;}


Thanks @Stonz2 by the code in Objective-C. It works like a charm! I used it in my Swift project. The same code in Swift:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {    let positionOriginal = textField.beginningOfDocument    let cursorLocation = textField.position(from: positionOriginal, offset: (range.location + NSString(string: string).length))    /* MAKE YOUR CHANGES TO THE FIELD CONTENTS AS NEEDED HERE */    if let cursorLoc = cursorLocation {        textField.selectedTextRange = textField.textRange(from: cursorLoc, to: cursorLoc)    }    return false }


This is an old question, but I had a similar issue and resolved it with the following Swift:

// store the current cursor position as a rangevar preAttributedRange: NSRange = textField.selectedRange // apply attributed stringvar attributedString:NSMutableAttributedString = NSMutableAttributedString(string: fullString)attributedString = format(textField.text) as NSMutableAttributedStringtextField.attributedText = attributedString// reapply the rangetextField.selectedRange = preAttributedRange

It works in the context of my app, hopefully it's useful for someone!