NSTokenField со смешанным вводом токена / строки, возможно?

При вводе недействительного адреса электронной почты в NSTokenField Mail вы получаете следующее (сочетание значений токена и простой строки):

альтернативный текст

Есть ли рекомендуемый способ сделать это?
Является ли NSTokenField правильным инструментом для этого? Или я буду злоупотреблять этим?

В этом конкретном проекте мне нужно разрешить пользователю вводить шаблон имени файла
(есть несколько других вариантов использования), с поддержкой предварительно определенных токенов.

Прямо сейчас я требую, чтобы ввод был введен так:

Glue Text %[Tag]Other Glue Text%[Another Tag]More Text

Я хотел бы изменить это на какое-то надежное графическое решение, подобное этому: альтернативный текст

NSTokenField всегда (!) Превращает введенный текст в токены.

Либо я использую неправильные ключевые слова в своих веб-поисках,
или я действительно первый, кому нужно это (смешанное) поведение?!

Я прочитал руководство Apple по NSTokenField, но не смог найти никакой информации по моей проблеме.

2 ответа

Решение

Вам необходимо реализовать метод делегата tokenField:styleForRepresentedObject: вернуть либо NSRoundedTokenStyle для токенов или NSPlainTextTokenStyle для другого текста. Представляемый объект для токена является самой строкой токена, если только ваш делегат не возвращает другие объекты.

Это должно помочь вашему делу:

- (NSTokenStyle)tokenField:(NSTokenField *)tokenField
 styleForRepresentedObject:(id)representedObject
{
    if ([representedObject rangeOfString: @"%["].location == 0) {
        return NSRoundedTokenStyle;
    } else {
        return NSPlainTextTokenStyle;
    }
}

На самом деле, сначала вы должны определить символ токена, который в вашем случае будет%

[tokenField setTokenizingCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@"%%"]];

Строка ввода также должна быть изменена на:

Текст клея%[Tag]% Другой текст клея%[Another Tag]% Больше текста

... так что Какао знает, где заканчивается токен.

И если вы хотите, чтобы [Tag] отображался как Tag в поле токена, вам также необходимо реализовать tokenField:displayStringForRepresentedObject: метод:

- (NSTokenStyle)tokenField:(NSTokenField *)tokenField
 displayStringForRepresentedObject:(id)representedObject
{
    if ([representedObject rangeOfString: @"["].location == 0) {
        return [(NSString*)representedObject substringWithRange:NSMakeRange(1, [(NSString*)representedObject length]-2)];

    return representedObject;
}

Однако это имеет большой недостаток: если вы копируете или просто перемещаете токен, Cocoa вызовет tokenField:displayStringForRepresentedObject: и скопированный / перемещенный токен будет заменен обычным текстовым тегом вместо токена [Tag].

Если у кого-то есть решение вышеуказанной проблемы, я буду рад его прочитать.

Другие вопросы по тегам