I'm changing the content of a UITextView with the following code:
mainTextField.replaceRange((theRange), withText: newStr)
Then I would like to select the new text. I'm trying to use the following code:
mainTextField.becomeFirstResponder()
let startPosition = mainTextField.positionFromPosition(mainTextField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: startingPoint)
let endPosition = mainTextField.positionFromPosition(mainTextField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: endingPoint)
if startPosition != nil && endPosition != nil {
mainTextField.selectedTextRange = mainTextField.textRangeFromPosition(startPosition!, toPosition: endPosition!)
}
The problem is that I don't know how to get the startingPoint and endingPoint values. Is it possible to get them in some ways from the replaceRange(range: UITextRange, withText: String) statement?
EDIT:
To try to clarify a bit my question:
// mainTextField content = "Have a good day"
// mainTextField selected text = "good"
mainTextField.replaceRange((theRange), withText: "happy")
// here theRange refers the selected text "good" not the new one "happy"
How to select the new text ("happy")?
You just need to use the length of the string to determine the UITextRange
of the selection. For example:
extension UITextView // I created this become sometimes it's nice to work with NSRange rather than UITextRange but it's not necessary for your problem.
{
func textRangeFromNSRange(range:NSRange) -> UITextRange?
{
let beginning = self.beginningOfDocument
guard let start = self.positionFromPosition(beginning, offset: range.location), end = self.positionFromPosition(start, offset: range.length) else { return nil}
return self.textRangeFromPosition(start, toPosition: end)
}
}
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.textView.selectable = true
self.textView.text = "the quick brown fox jumped over the lazy dog"
let range = self.textView.textRangeFromNSRange(NSRange(location: 0, length: 3))!
let text = "how now brown cow"
self.textView.replaceRange(range, withText: text)
self.textView.selectedTextRange = textView.textRangeFromPosition(range.start, toPosition: textView.positionFromPosition(range.start, offset: text.characters.count)!) //should probably break this into multiple lines for better readability
self.textView.becomeFirstResponder()
}
}
In the above example "the" will be replaced by "how now brown cow" and "how now brown cow" will be selected. I'm using a convenience function to convert an NSRange
into a UITextRange
. The range will start at index 0 and go for 3 characters ("the"). I replace that with the string "how now brown cow." Then I use the previous UITextRange and my replacement string to construct a new UITextRange
(textView.textRangeFromPosition(range.start, toPosition: textView.positionFromPosition(range.start, offset: text.characters.count)!)
). I then set to the textView's selectedTextRange
. You should make sure that your UITextView
is selectable and then call becomeFirstResponder on your
UITextView`.