选择刚刚用replaceRange更新的文本(范围:UITextRange,withText:String) [英] Selecting the text just updated with replaceRange(range: UITextRange, withText: String)

查看:609
本文介绍了选择刚刚用replaceRange更新的文本(范围:UITextRange,withText:String)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下代码更改UITextView的内容:

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

问题是我不知道如何获取startingPoint和EndingPoint值.是否可以通过 replaceRange(范围:UITextRange,withText:字符串)语句以某种方式获取它们?

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?

为了澄清我的问题:

// 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"

如何选择新文字("happy")?

How to select the new text ("happy")?

推荐答案

您只需要使用字符串的长度来确定所选内容的UITextRange.例如:

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


           }
}

在上面的示例中,"the"将被替换为"how now brown cow"和"how now brown cow".我正在使用便捷功能将NSRange转换为UITextRange.范围将从索引0开始,并持续3个字符("the").我将其替换为字符串现在如何变成棕色母牛".然后,我使用以前的UITextRange和替换字符串来构造一个新的UITextRange(textView.textRangeFromPosition(range.start, toPosition: textView.positionFromPosition(range.start, offset: text.characters.count)!)).然后,我将其设置为textView的selectedTextRange.您应该确保您的UITextView是可选的,然后调用becomeFirstResponder on your UITextView`.

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 yourUITextView`.

这篇关于选择刚刚用replaceRange更新的文本(范围:UITextRange,withText:String)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆