Control cursor position in UITextField Control cursor position in UITextField ios ios

Control cursor position in UITextField


Controlling cursor position in a UITextField is complicated because so many abstractions are involved with input boxes and calculating positions. However, it's certainly possible. You can use the member function setSelectedTextRange:

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

Here's a function which takes a range and selects the texts in that range. If you just want to place the cursor at a certain index, just use a range with length 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]];}

For example, to place the cursor at idx in the UITextField input:

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


Useful to position at index (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)}


I've finally found a solution for this problem! You can put the text you need inserted into the system pasteboard and then paste it at the current cursor position:

[myTextField paste:self]  

I found the solution on this person's blog:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

The paste functionality is OS V3.0 specific, but I've tested it and it works fine for me with a custom keyboard.

If you go for this solution then you should probably save the user's existing clipboard contents and restore them immediately afterwards.