如何 select textView 中的文本在 Swift 中具有 NSRange?
How to select a text in a textView having a NSRange in Swift?
我有一个 UITextView
我想 select 文本的一部分。我正在尝试使用 selectedTextRange
,不幸的是我得到了这个错误:
Cannot convert value of type 'NSRange' (aka '_NSRange') to expected
argument type 'UITextRange'
这是我正在尝试使用的代码:
mainTextField.becomeFirstResponder()
mainTextField.selectedTextRange = mainTextField.textInRange(matchRange) // matchRange is a NSRange
我使用的范围来自我改编自 this tutorial1:
的正则表达式
编辑:添加了第一行
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
为了添加更多信息,我还找到了另一种方法:您可以使用 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
Swift 4 的更新版本:
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)
}
}
我有一个 UITextView
我想 select 文本的一部分。我正在尝试使用 selectedTextRange
,不幸的是我得到了这个错误:
Cannot convert value of type 'NSRange' (aka '_NSRange') to expected argument type 'UITextRange'
这是我正在尝试使用的代码:
mainTextField.becomeFirstResponder()
mainTextField.selectedTextRange = mainTextField.textInRange(matchRange) // matchRange is a NSRange
我使用的范围来自我改编自 this tutorial1:
的正则表达式编辑:添加了第一行
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
为了添加更多信息,我还找到了另一种方法:您可以使用 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
Swift 4
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)
}
}