在UITextField控件光标位置(Control cursor position in UITe

2019-07-20 07:03发布

我有一个UITextField我正在迫使通过修改变更通知处理程序中的文本格式上。 这个伟大的工程(一旦我解决了重入问题),但给我留下了一个更恼人的问题。 如果用户移动比字符串的结尾以外的某个地方光标然后我的格式更改它移动到字符串的结尾。 这意味着用户不能同时插入多个字符在文本字段的中间。 有没有办法记住,然后重新在光标所在位置UITextField

Answer 1:

一种控制的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]];
}

例如,为了将光标放在idx在的UITextField input

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


Answer 2:

有用的位置索引(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)
}


Answer 3:

我终于找到了这个问题的解决方案! 你可以把你需要插入到系统纸板,然后在当前光标位置粘贴文本:

[myTextField paste:self]  

我发现这个人的博客的解决方案:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html

该粘贴功能是OS V3.0的具体,但我测试,它工作正常,我有一个自定义键盘。

如果你去了这个解决方案,那么你或许应该保存用户的现有剪贴板中的内容,并随即恢复。



Answer 4:

这里的@克里斯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)
}


Answer 5:

随意使用此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


Answer 6:

我不认为有一种方法可以将光标在您的特定地点UITextField (除非你有非常棘手和模拟触摸事件)。 相反,我会处理的格式化,当用户已经完成编辑他们的文本(在textFieldShouldEndEditing:如果他们输入不正确,不容许的文本字段完成编辑。



Answer 7:

下面是针对此问题能正常工作的一个片段:

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

从@omz来源



文章来源: Control cursor position in UITextField