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.