我有一个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
}
其中matchRange
是NSRange
,range
是UITextRange
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