如何在复制粘贴后将光标放在格式化数字的末尾?

时间:2018-11-05 09:17:16

标签: ios swift

所以这是我的问题。 我正在使用UITextField作为支付卡号,并且正在 .editingChanged 上格式化该号码,以使其始终具有4位数字的格式,并且两者之间具有空格。 (示例:5213 0000 0000 1234 )。

问题是,例如,当我从短信中复制(未格式化的)数字时,光标将出现在第16个字符之后(示例:5213 0000 0000 1 | 234 )。

我需要将光标放在末尾,但到目前为止,对我来说没有任何作用。 我试过在格式化后在 .editingChanged 上触发的同一功能中设置位置(我将answer用作教程),但没有任何反应。

我还尝试使自定义UITextField覆盖 closestPosition 函数,以使光标始终位于末尾,用户不会移动它,但即使该光标出现在第16位复制粘贴后的位置。

有人知道如何处理吗? 感谢您的所有帮助。 <3

(注意:我们仅支持16位数字的卡号)

1 个答案:

答案 0 :(得分:1)

您可以使用文本字段的selectedTextRange属性(它采用的UITextInput协议的一部分)来更新光标位置。

在修改文本字段的text属性后,更新该属性:

// Add spaces as required here then:

DispatchQueue.main.async {
    let end = self.textField.endOfDocument
    let range = self.textField.textRange(from: end, to: end)
    self.textField.selectedTextRange = range
}

注意:如果您在紧接之前修改了文本字段的text字符串,则通常必须安排在下一个运行循环中进行此操作(因此使用{{1 }} main)。不知道为什么会这样,但是可能是一个DispatchQueue错误。

可以在这里找到UIKit文档(如果您想对文本字段执行某些操作而不是访问其文本,总是一个不错的开始):

https://developer.apple.com/documentation/uikit/uitextinput