Предполагая, что вы используете NSTextAttachment
подкласс, должно быть довольно легко выполнить обе задачи, но давайте сосредоточимся на второй:
Ваше первое решение подкласса NSTextStorage
хорошо, но оноподвергать хранилище большому количеству нежелательной логики, я предлагаю просто иметь свой (NS|UI)TextViewDelegate
для реализации func textDidChange(_ notification: Notification)
, и при изменении текста вы можете использовать хранилище текста для перечисления ваших вложений и сохранения списка диапазонов для последующего использования.:
func textDidChange(_ notification: Notification)
{
self.textView.textStorage?.enumerateAttribute(NSAttributedString.Key.attachment, in: NSMakeRange(0, self.textView.textStorage!.length), options: [], using: {
(value:Any?, range:NSRange, stop:UnsafeMutablePointer<ObjCBool>) in
// If the value is one of your attachment save the range in a list
})
}
Таким образом, не имеет значения, что делает пользователь (запись, копирование / вставка и т. Д.), У вас всегда будет список допустимых диапазонов, содержащих ваш разделитель:)
Это всего лишь пример, ваша логика для перестройки списка может быть более точной, но я надеюсь, что это поможет вам начать.