我一直在尝试UITextField
以及如何使用它的光标位置。我发现了许多与Objective-C相关的答案,例如
但是由于我正在使用Swift,所以我想学习如何获取当前光标位置以及如何在Swift中进行设置。
下面的答案是我从Objective-C进行实验和翻译的结果。
我一直在尝试UITextField
以及如何使用它的光标位置。我发现了许多与Objective-C相关的答案,例如
但是由于我正在使用Swift,所以我想学习如何获取当前光标位置以及如何在Swift中进行设置。
下面的答案是我从Objective-C进行实验和翻译的结果。
Answers:
以下内容适用于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()
给予重点的文本字段,使键盘出现。
请参阅此答案以获取如何在一定范围内获取文字。
textField.endOfDocument
。您也可以使用下划线或空格来表示缺少的字母。
就我而言,我必须使用DispatchQueue:
func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async{
textField.selectedTextRange = ...
}
}
从这个和其他线程没有其他工作。
PS:我仔细检查了textViewDidBeginEditing在哪个线程上运行,并且它是主线程,因为所有UI都应在上面运行,所以不确定为什么使用main.asynch的延迟这么短。
textViewDidBeginEditing
。因此,通过将其放在队列中,它将在调用者完成后发生。
对于您要设置的光标位置:
textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))
对于重置光标位置:
textView.endFloatingCursor()
注意:此示例在Textview和Textfield中均适用。