控制UITextField中的光标位置

Jer*_*emy 47 iphone uitextfield ios uitextrange uitextposition

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

Chr*_*s R 66

控制UITextField中的光标位置很复杂,因为输入框和计算位置涉及很多抽象.但是,这当然是可能的.您可以使用成员函数setSelectedTextRange:

[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
Run Code Online (Sandbox Code Playgroud)

这是一个函数,它取一个范围并选择该范围内的文本.如果您只想将光标放在某个索引处,只需使用长度为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]];
}
Run Code Online (Sandbox Code Playgroud)

例如,要将光标放在idxUITextField中input:

    [Helpers selectTextForInput:input 
                        atRange:NSMakeRange(idx, 0)];
Run Code Online (Sandbox Code Playgroud)


小智 5

对于定位索引很有用(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)
}
Run Code Online (Sandbox Code Playgroud)


pix*_*x0r 0

我认为没有办法将光标放置在你的特定位置UITextField(除非你非常棘手并模拟触摸事件)。相反,我会在用户完成编辑文本(在 中textFieldShouldEndEditing:)时处理格式,并且如果他们的输入不正确,则不允许文本字段完成编辑。

  • 我曾考虑过这一点,但我正在实施的方式与在 ATM 机上输入数字的方式类似。小数始终存在,当您键入数字时,它们会向左移动,因此输入 1-0-5-0 首先会得到 0.01,然后是 0.10、1.05、10.50。最后执行此操作将允许该字段为 1050,然后将其更改为 10.50,这对用户来说相当混乱。 (3认同)