在Swift中获取和设置UITextField和UITextView的光标位置

时间:2016-01-21 11:16:57

标签: ios swift uitextfield uitextview uitextposition

我一直在试验UITextField以及如何使用它的光标位置。我已经找到了许多关系Objective-C答案,如

但是由于我正在使用Swift,我想学习如何获取当前光标位置并在Swift中设置它。

以下答案是我从Objective-C进行实验和翻译的结果。

4 个答案:

答案 0 :(得分:237)

以下内容适用于UITextFieldUITextView

有用的信息

文本字段文本的开头:

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()将焦点置于文本字段并显示键盘。

  • 请参阅this answer了解如何在某个范围内获取文字。

另见

答案 1 :(得分:21)

在我的情况下,我不得不使用DispatchQueue:

func textViewDidBeginEditing(_ textView: UITextView) {

   DispatchQueue.main.async{
      textField.selectedTextRange = ...
   }
}

这个和其他线程没有其他工作。

PS:我仔细检查了运行textViewDidBeginEditing的线程,并且它是主线程,因为所有UI都应该运行,所以不确定为什么使用main.asynch的那个小延迟工作。

答案 2 :(得分:1)

我什至没有注意到,在您删除 textView 顶行上的一个单词后,我发布的应用程序之一中的 textView 实际上是从左侧开始的。 不仅插入符号会向左移动,而且文本将从您键入内容时插入符号所在的左侧开始! 不会在中间行或底行做,只有在顶部删除该行。

func textViewDidChange(_ textView: UITextView)
{
   if myTextView.text!.count > 0
   {
      myTextView.textAlignment = .center
   }
}

插入符号仍然在左侧,这并不理想,但至少添加了“if”语句后,它只会按预期从中心添加文本,而不会从左侧添加文本。

答案 3 :(得分:0)

let range = field.selectedTextRange

field.text = "hello world"

field.selectedTextRange = range