gpt4 book ai didi

swift - 在包含表情符号的 UITextView 中检测光标位置会在 swift 4 中返回错误的位置

转载 作者:搜寻专家 更新时间:2023-10-31 19:26:55 27 4
gpt4 key购买 nike

我正在使用此代码检测光标在 UITextView 中的位置:

if let selectedRange = textView.selectedTextRange {

let cursorPosition = textView.offset(from: textView.beginningOfDocument, to: selectedRange.start)

print("\(cursorPosition)")
}

我把它放在 textViewDidChange 函数下,用于在每次文本更改时检测光标位置。它工作正常,但是当我放置表情符号时,textView.text.count光标位置 不同。从 swift 4 开始,每个表情符号都算作一个字符,但似乎对于光标位置来说是不同的。

enter image description here

enter image description here

那么如何获得与文本中的字符数相匹配的准确光标位置?

最佳答案

长话短说:将 Swift 与 StringNSRange 一起使用时,请使用此扩展进行范围转换

extension String {
/// Fixes the problem with `NSRange` to `Range` conversion
var range: NSRange {
let fromIndex = unicodeScalars.index(unicodeScalars.startIndex, offsetBy: 0)
let toIndex = unicodeScalars.index(fromIndex, offsetBy: count)
return NSRange(fromIndex..<toIndex, in: self)
}
}

让我们深入了解一下:

let myStr = "Wéll helló ⚙️"
myStr.count // 12
myStr.unicodeScalars.count // 13
myStr.utf8.count // 19
myStr.utf16.count // 13

Swift 4 中,字符串是字符的集合(ö 和 emoji 等复合字符将算作一个字符)。 UTF-8UTF-16 View 分别是UTF-8和UTF-16编码单元的集合。

你的问题是,textView.text.count 计算集合元素(表情符号和复合字符将算作一个元素)并且 NSRange 计算 UTF- 的索引16 个代码单元。上面的片段说明了差异。


更多在这里: Strings And Characters

关于swift - 在包含表情符号的 UITextView 中检测光标位置会在 swift 4 中返回错误的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52869100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com