[英]How to generate NSRange correctly for a given String to represent end of String?
目前,我的应用在我们的数据 model 中使用NSRange
来表示UITextView
中的 cursor position。
有时,我们会生成NSRange
来表示UITextView
中的位置结束/字符串结束。
这是我们生成NSRange
的代码。
extension NSRange {
static func endOfStringFocused(_ string: String?) -> NSRange {
return NSRange(location: string?.count ?? 0, length: 0)
}
}
class ViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
textView.selectedRange = NSRange.endOfStringFocused(textView.text)
textView.becomeFirstResponder()
}
}
当字符串中没有表情符号时,这就是结果。 它按预期工作,因为 cursor 现在位于字符串的末尾。
但是,当使用非英文字符(表情符号)时,结果不正确。 cursor 不再位于字符串的末尾。
我可以知道,如何为给定的字符串正确生成NSRange
以表示字符串的结尾?
有很多方法。 我建议制作一个 Swift Range<String.Index>
,并将其转换为NSRange
:
NSRange(string.endIndex..., in: string)
发生错误行为的原因是因为NSRange
中的location
属性计算的事物(UTF-16 代码单元)与 Swift String.count
属性计算的不同(Swift Character
的数量,它们是扩展的字形簇,在字符串)。 因此,要解决这个问题,我们也可以将正确的数字传递给NSRange(location:length:)
:
NSRange(location: string.utf16.count, length: 0)
// or
NSRange(location: (string as NSString).length, length: 0)
但我发现这些不如仅将 Swift 范围转换为NSRange
直观。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.