获取和斯威夫特设置的UITextField的光标位置,UITextView的获取和斯威夫特设置的UI

2019-05-11 15:40发布

我一直在尝试UITextField以及如何使用它的光标位置工作。 我发现了一些关系,Objective-C的答案,如

  • 获取的UITextField的iOS中的光标位置
  • 在UITextField控件光标位置
  • 目前的UITextField被编辑字

但自从我与斯威夫特的工作,我想了解如何获得当前光标位置,并设置它在斯威夫特。

下面的答案是我的实验和翻译从Objective-C中的结果。

Answer 1:

下面的内容适用于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()给予重点的文本字段,使键盘出现。

  • 见这个答案如何获得在一定范围内的文本。

也可以看看

  • 如何创建一个斯威夫特范围


Answer 2:

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

func textViewDidBeginEditing(_ textView: UITextView) {

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

没有别的从这和其他线程的工作。

PS:我仔细检查了该线程没有使用的原因是main.asynch几乎没有延迟工作textViewDidBeginEditing正在运行,并且它是主线程,因为所有的UI应该运行,所以不知道。



Answer 3:

在您的点设置光标位置:

textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))

对于复位光标位置:

textView.endFloatingCursor()

注意 :这个例子在这两个TextView的文本字段和工作。



文章来源: Getting and Setting Cursor Position of UITextField and UITextView in Swift