如何 select textView 中的文本在 Swift 中具有 NSRange?

How to select a text in a textView having a NSRange in Swift?

我有一个 UITextView 我想 select 文本的一部分。我正在尝试使用 selectedTextRange,不幸的是我得到了这个错误:

Cannot convert value of type 'NSRange' (aka '_NSRange') to expected argument type 'UITextRange'

这是我正在尝试使用的代码:

mainTextField.becomeFirstResponder()
mainTextField.selectedTextRange = mainTextField.textInRange(matchRange) // matchRange is a NSRange

我使用的范围来自我改编自 this tutorial1:

的正则表达式

编辑:添加了第一行

if let regex =  NSRegularExpression(options: searchOptions){ // refers to an installed extension convenience init
let range = NSMakeRange(0, (mainTextField.text.characters.count))
let matches = regex.matchesInString(mainTextField.text, options: [], range: range)
[...]

您可以在 UITextView 上添加一个扩展程序来进行转换。

    extension UITextView
    {
        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)
        }
    }

使用

    if let range = mainTextView.textRangeFromNSRange(range: matchRange){
        mainTextField.selectedTextRange = range
    }

其中 matchRangeNSRangerangeUITextRange

为了添加更多信息,我还找到了另一种方法:您可以使用 selectedRange 而不是使用 selectedTextRange 并进行转换。

注意:matchRange 是一个 NSRange

// this don't work because selectedTextRange requires an UITextRange
textField.selectedTextRange = textField.textInRange(matchRange) // don't work

// this works because selectedRange requires a NSRange
textField.selectedRange = matchRange // works

Swift 4 的更新版本:

extension UITextView {

    func textRangeFromNSRange(range:NSRange) -> UITextRange? {
        let beginning = beginningOfDocument
        guard let start = position(from: beginning, offset: range.location), let end = position(from: start, offset: range.length) else { return nil }

        return textRange(from: start, to: end)
    }
}