Я использую UITextView
с включенным редактированием текстовых атрибутов, и у меня возникают проблемы с получением атрибутов, когда в тексте содержатся смайлики.
Вот код, который я использую:
var textAttributes = [(attributes: [NSAttributedString.Key: Any], range: NSRange)]()
let range = NSRange(location: 0, length: textView.attributedText.length)
textView.attributedText.enumerateAttributes(in: range) { dict, range, _ in
textAttributes.append((attributes: dict, range: range))
}
for attribute in textAttributes {
if let swiftRange = Range(attribute.range, in: textView.text) {
print("NSRange \(attribute.range): \(textView.text![swiftRange])")
} else {
print("NSRange \(attribute.range): cannot convert to Swift range")
}
}
И когда я пробую это с текстом типа «Образец текста ❤️», вот что получится:
NSRange {0, 12}: Образец текста
NSRange {12, 1}: невозможно преобразовать в диапазон Swift
NSRange {13, 1}: невозможно преобразовать в диапазон Swift
Итак, как вы можете видеть, я не могу получить текст сэмодзи в нем.
Атрибуты текста задаются моим пользовательским NSTextStorage
, применяемым к текстовому представлению.Вот метод setAttributes
:
override func setAttributes(_ attrs: [NSAttributedString.Key: Any]?, range: NSRange) {
guard (range.location + range.length - 1) < string.count else {
print("Range out of bounds")
return
}
beginEditing()
storage.setAttributes(attrs, range: range)
edited(.editedAttributes, range: range, changeInLength: 0)
endEditing()
}
Обратите внимание, что во время редактирования моего текстового представления у меня есть некоторые распечатки "Range of the bounds".
Есть ли способ конвертировать NSRange
до действительного Swift Range
?