如何在swift中具有nsrange的文本视图中选择文本



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

无法将" nsrange"类型的值转换为预期 参数类型'uitextrange'

这是我要使用的代码:

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

我正在使用的范围来自我从此教程中改编的正则是:

编辑:添加第一行

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

swift 4更新版的 @beyowulf的答案:

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

只是为了添加更多信息,我也找到了一种替代方法:您可以使用SelectedRange。

注意: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

最新更新