控制UITextField中的光标位置

我有一个UITextField ,我强制格式化通过修改更改通知处理程序中的文本。 这很好(一旦我解决了重入问题),但留给我更多的唠叨问题。 如果用户将光标移动到string末尾以外的位置,则我的格式更改会将其移动到string的末尾。 这意味着用户不能一次插入多个字符到文本字段的中间。 有没有办法记住,然后重置UITextField的光标位置?

控制UITextField中的光标位置是非常复杂的,因为input框和计算位置涉及到如此多的抽象。 但是,这当然是可能的。 你可以使用成员函数setSelectedTextRange

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

这是一个函数,它需要一个范围并select该范围内的文本。 如果您只想将光标置于某个索引处,只需使用长度为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]]; } 

例如,要将光标置于UITextField input中的idx

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

我终于find了这个问题的解决scheme! 您可以将所需的文本插入到系统粘贴板中,然后将其粘贴到当前的光标位置:

 [myTextField paste:self] 

我在这个人的博客上find了解决scheme:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

粘贴function是特定于OS V3.0的,但是我已经testing过了,它对于我自定义的键盘来说工作的很好。

如果你去这个解决scheme,那么你应该保存用户现有的剪贴板内容,然后立即恢复。

有用的指数(斯威夫特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) } 

这里是@Chris R的Swift版本 – 更新了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) } 

我不认为有一种方法可以将光标放在UITextField中的特定位置(除非你非常棘手并且模拟了触摸事件)。 相反,我会处理格式,当用户完成编辑他们的文本(在textFieldShouldEndEditing: ,如果他们的条目不正确,不要让文本字段完成编辑。

随意使用这个UITextField类别来获取和设置光标位置:

 @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 

这是一个适用于这个问题的代码片段:

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

来自@omz