NSTextView с жетонами

Как добавить токены, например NSTokenField, в NStextView?

Ответ 1

Это на самом деле немного сложно. Вам нужно будет создать пользовательский NSTextAttachment для каждого "токена" и вставить его в NSTextStorage для NSTextView.

Существует отличная статья Дэвида Синклера в Dejal Systems, в которой объясняется, как это сделать.

Ответ 2

Я понял простой подход, который использует собственный класс ячеек для токенов:

  • Напишите класс ячеек, наследующий NSTextAttachmentCell и reimplement
    - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
    Это будет класс, который представляет токены в вашем NSTextView.
  • Чтобы вставить маркер, выполните следующие действия:
    • Создайте экземпляр NSTextAttachment
    • Установите ячейку вложения в экземпляр класса вашей токенной ячейки.
    • Создайте атрибутную строку с этим вложением.
    • Вставьте присланную строку в текстовое представление.

Метод, который вставляет токен в текстовое представление, может выглядеть так:

- (void)insertAttachmentCell:(NSTextAttachmentCell *)cell toTextView:(NSTextView *)textView
{
    NSTextAttachment *attachment = [NSTextAttachment new];
    [attachment setAttachmentCell:cell];
    [textView insertText:[NSAttributedString attributedStringWithAttachment:attachment]];
}

Этот подход более подходит для токенов, чем у Дэвид Синклер. Нет необходимости использовать обертки файлов, так как мы хотим отображать динамическое содержимое (токены), а не статические изображения.
Однако взглянуть на концепции Дэвида может быть полезно. Он изображает хороший подход к реализации перетаскивания или. функции копирования пасты.