我一直在试验UITextField
以及如何使用它的光标位置。我发现了许多关系 Objective-C 的答案,如
但由于我正在使用 Swift,我想学习如何获取当前光标位置并在 Swift 中进行设置。
下面的答案是我从 Objective-C 进行实验和翻译的结果。
我一直在试验UITextField
以及如何使用它的光标位置。我发现了许多关系 Objective-C 的答案,如
但由于我正在使用 Swift,我想学习如何获取当前光标位置并在 Swift 中进行设置。
下面的答案是我从 Objective-C 进行实验和翻译的结果。
以下内容适用于UITextField
和UITextView
。
文本字段文本的最开始:
let startPosition: UITextPosition = textField.beginningOfDocument
文本字段文本的最后:
let endPosition: UITextPosition = textField.endOfDocument
当前选择的范围:
let selectedRange: UITextRange? = textField.selectedTextRange
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
print("\(cursorPosition)")
}
为了设置位置,所有这些方法实际上都是设置具有相同开始值和结束值的范围。
到开始
let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
到最后
let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
到当前光标位置左侧的一个位置
// only if there is a currently selected range
if let selectedRange = textField.selectedTextRange {
// and only if the new position is valid
if let newPosition = textField.position(from: selectedRange.start, offset: -1) {
// set the new position
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
}
到任意位置
从头开始,向右移动 5 个字符。
let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
选择所有文本
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
选择文本范围
// Range: 3 to 7
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3)
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7)
if startPosition != nil && endPosition != nil {
textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!)
}
在当前光标位置插入文本
textField.insertText("Hello")
用于textField.becomeFirstResponder()
将焦点放在文本字段并显示键盘。
有关如何在某个范围内获取文本的信息,请参阅此答案。
就我而言,我不得不使用 DispatchQueue:
func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async {
textField.selectedTextRange = ...
}
}
这个和其他线程没有任何其他工作。
PS:我仔细检查了 textViewDidBeginEditing 在哪个线程上运行,它是主线程,因为所有 UI 都应该运行,所以不知道为什么使用 main.asynch 的小延迟起作用。
let range = field.selectedTextRange
field.text = "hello world"
field.selectedTextRange = range
For set cursor position at your point:
textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))
For reset cursor position:
textView.endFloatingCursor()
Note: This example works in both Textview & Textfield.
我什至没有注意到,在您删除 textView 顶行的一个单词后,我发布的一个应用程序中的 textView 实际上是从左侧开始的。插入符号不仅会向左移动,而且文本也会从您键入内容时插入符号所在的左侧开始!它不会在中间线或底线中执行此操作,仅当在顶部删除该行时。
func textViewDidChange(_ textView: UITextView)
{
if myTextView.text!.count > 0
{
myTextView.textAlignment = .center
}
}
插入符号仍然向左移动,这并不理想,但至少在添加了“if”语句后,它只会按预期从中心添加文本,而不会从左侧添加文本。