我有UITextField
我通过修改更改通知处理程序中的文本来强制格式化。这很有效(一旦我解决了重入问题),但又给我留下了一个唠叨的问题。
如果用户将光标移动到字符串末尾以外的某个位置,则我的格式更改会将其移动到字符串的末尾。这意味着用户不能一次插入多个字符到文本字段的中间。
有没有办法记住然后重置UITextField
中的光标位置?
答案 0 :(得分:66)
控制UITextField中的光标位置很复杂,因为输入框和计算位置涉及很多抽象。但是,这当然是可能的。您可以使用成员函数setSelectedTextRange
:
[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
这是一个函数,它取一个范围并选择该范围内的文本。如果您只想将光标放在某个索引处,只需使用长度为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 idx
的{{1}}处:
input
答案 1 :(得分:4)
位于索引(Swift 3)
有用sum
答案 2 :(得分:3)
我终于找到了解决这个问题的方法!您可以将需要插入的文本放入系统粘贴板,然后将其粘贴到当前光标位置:
[myTextField paste:self]
我在这个人的博客上找到了解决方案:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html
粘贴功能是特定于OS V3.0的,但我已经测试过它,并且使用自定义键盘对我来说效果很好。
如果您使用此解决方案,那么您应该保存用户现有的剪贴板内容并在之后立即恢复。
答案 3 :(得分:2)
这是Swift版本的@Chris R. - 为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)
}
答案 4 :(得分:1)
随意使用此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
答案 5 :(得分:0)
我认为没有办法将光标放在UITextField
的特定位置(除非你非常棘手并模拟触摸事件)。相反,当用户完成编辑其文本(在textFieldShouldEndEditing:
中)并且如果他们的条目不正确时,我会处理格式化,不允许文本字段完成编辑。
答案 6 :(得分:-2)
这是一个适用于此问题的代码段:
- (void)textFieldDidBeginEditing:(UITextField *)textField{
UITextPosition *positionBeginning = [textField beginningOfDocument];
UITextRange *textRange =[textField textRangeFromPosition:positionBeginning
toPosition:positionBeginning];
[textField setSelectedTextRange:textRange];
}