如何在Swift中使用NSRange的textView中选择文本?

时间:2016-06-20 19:28:34

标签: swift uitextview nsrange selectedtext

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

  

无法将'NSRange'(又名'_NSRange')类型的值转换为预期值   参数类型'UITextRange'

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

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

我正在使用的范围来自我改编自this tutorial 1的正则表达式:

编辑:添加了第一行

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)
[...]

3 个答案:

答案 0 :(得分:4)

您可以在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

答案 1 :(得分:0)

为了添加更多信息,我发现了另一种方法:不使用selectedTextRange并进行转换,您可以使用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

答案 2 :(得分:0)

Swift 4的@beyowulf's answer更新版本:

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