【问题标题】:Selecting the text just updated with replaceRange(range: UITextRange, withText: String)选择刚刚用 replaceRange(range: UITextRange, withText: String) 更新的文本
【发布时间】:2016-06-04 21:07:05
【问题描述】:

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

mainTextField.replaceRange((theRange), withText: newStr)

然后我想选择新文本。我正在尝试使用以下代码:

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

问题是我不知道如何获取起点和终点值。是否可以从 replaceRange(range: UITextRange, withText: String) 语句中以某种方式获取它们?

编辑: 尝试澄清一下我的问题:

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

如何选择新文本(“快乐”)?

【问题讨论】:

  • 为什么您需要知道startingPointendingPoint 是什么?你已经知道theRange。你可以直接说mainTextField.selectedTextRange = theRange,不是吗?
  • 因为我的范围是旧的,所以我用这个代码更改了 UITextView 的文本:mainTextField.replaceRange((theRange), withText: newStr)

标签: xcode swift2 uitextview


【解决方案1】:

您只需要使用字符串的长度来确定选择的UITextRange。例如:

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”)。我用字符串“how now brown cow”替换它。然后我使用之前的 UITextRange 和我的替换字符串来构造一个新的UITextRange (textView.textRangeFromPosition(range.start, toPosition: textView.positionFromPosition(range.start, offset: text.characters.count)!))。然后我设置为 textView 的selectedTextRange。你应该确保你的UITextView 是可选的,然后调用becomeFirstResponder on yourUITextView`。

【讨论】:

  • 谢谢你!
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多