2

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

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

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

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

我使用的范围来自我改编自本教程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)
[...]
4

3 回答 3

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
    }

哪里matchRange是一个NSRangerange是一个UITextRange

于 2016-06-20T22:02:44.290 回答
1

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)
    }
}
于 2019-01-22T14:33:12.727 回答
-1

只是为了添加更多信息,我还发现了另一种方法:您可以使用 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
于 2016-06-20T23:35:45.737 回答