繁体   English   中英

如何为给定的字符串正确生成 NSRange 以表示字符串的结尾?

[英]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)

另请参阅:来自 Swift 范围的 NSRange?

发生错误行为的原因是因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM