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

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

  • 在ios中获取UITextField的游标位置
  • 控制UITextField中的光标位置
  • UITextField获取当前编辑的单词

但是因为我正在使用Swift,我想学习如何获取当前的光标位置,并将其设置在Swift中。

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

Swift 3已经更新了这个答案

以下内容适用于UITextFieldUITextView

有用的信息

文本字段文本的开始:

 let startPosition: UITextPosition = textField.beginningOfDocument 

文本字段文本的最后一行:

 let endPosition: UITextPosition = textField.endOfDocument 

当前select的范围:

 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) } 

有关

select所有文字

 textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument) 

select一个文本范围

 // 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()将焦点放在文本字段上并使键盘出现。

  • 看到这个答案如何获得在一定范围内的文字。

也可以看看

  • 如何在Swift中创build一个范围