Sur*_*gch 93 uitextfield uitextview ios uitextposition swift
我一直在尝试UITextField和如何使用它的光标位置.我已经找到了许多关系Objective-C答案,如
但由于我正在使用Swift,我想学习如何获取当前光标位置并在Swift中设置它.
下面的答案是我从Objective-C进行实验和翻译的结果.
Sur*_*gch 271
以下内容适用于UITextField和UITextView.
文本字段文本的开头:
let startPosition: UITextPosition = textField.beginningOfDocument
Run Code Online (Sandbox Code Playgroud)
文本字段文本的最后:
let endPosition: UITextPosition = textField.endOfDocument
Run Code Online (Sandbox Code Playgroud)
当前选择的范围:
let selectedRange: UITextRange? = textField.selectedTextRange
Run Code Online (Sandbox Code Playgroud)
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
print("\(cursorPosition)")
}
Run Code Online (Sandbox Code Playgroud)
为了设置位置,所有这些方法实际上都是设置具有相同开始值和结束值的范围.
到了开始
let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
Run Code Online (Sandbox Code Playgroud)
到最后
let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
Run Code Online (Sandbox Code Playgroud)
到当前光标位置左侧的一个位置
// 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)
}
}
Run Code Online (Sandbox Code Playgroud)
到任意位置
从头开始,向右移动5个字符.
let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
Run Code Online (Sandbox Code Playgroud)
选择所有文字
textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)
Run Code Online (Sandbox Code Playgroud)
选择一系列文字
// 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!)
}
Run Code Online (Sandbox Code Playgroud)
在当前光标位置插入文本
textField.insertText("Hello")
Run Code Online (Sandbox Code Playgroud)
用于textField.becomeFirstResponder()将焦点置于文本字段并使键盘显示.
有关如何在某个范围内获取文本,请参阅此答案.
Mic*_*Ros 29
在我的情况下,我不得不使用DispatchQueue:
func textViewDidBeginEditing(_ textView: UITextView) {
DispatchQueue.main.async{
textField.selectedTextRange = ...
}
}
Run Code Online (Sandbox Code Playgroud)
这个和其他线程没有其他工作.
PS:我仔细检查了运行textViewDidBeginEditing的线程,并且它是主线程,因为所有UI都应该运行,所以不确定为什么使用main.asynch的那个小延迟工作.
let range = field.selectedTextRange
field.text = "hello world"
field.selectedTextRange = range
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
71025 次 |
| 最近记录: |