我有一个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)
[...]
答案 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
}
其中matchRange
是NSRange
而range
是UITextRange
答案 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)
}
}