NSTokenField со смешанным вводом токена / строки, возможно? - PullRequest
14 голосов
/ 22 ноября 2010

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

alt text

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

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

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

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

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 22 ноября 2010

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

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

- (NSTokenStyle)tokenField:(NSTokenField *)tokenField
 styleForRepresentedObject:(id)representedObject
{
    if ([representedObject rangeOfString: @"%["].location == 0) {
        return NSRoundedTokenStyle;
    } else {
        return NSPlainTextTokenStyle;
    }
}
2 голосов
/ 19 мая 2011

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

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

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

Клей Текст% [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].

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

...