可能带有混合令牌/字符串输入的NSTokenField?

时间:2010-11-22 11:25:36

标签: objective-c cocoa nstokenfield

在Mail的 NSTokenField 中输入无效的电子邮件时,一个得到这个(混合令牌纯字符串值):

alt text

有没有可行的方法来实现这个目标?
NSTokenField甚至是正确的工具吗?或者我会滥用它?

在这个特定项目中,我需要允许用户输入文件名模式
(还有其他一些用例),支持预定义的令牌。

现在我要求输入如下:

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

我想将其更改为这样的一些防呆图形解决方案: alt text

NSTokenField always(!)将输入的文本转换为标记。

我在网络搜索中使用了错误的关键字,
或者我真的是第一个需要这种(混合)行为的人?!

我确实通过Apple的NSTokenField指南阅读,但找不到有关我的问题的任何信息。

2 个答案:

答案 0 :(得分:12)

您需要实现委托方法tokenField:styleForRepresentedObject:,以便为令牌返回NSRoundedTokenStyle,或为其他文本返回NSPlainTextTokenStyle。除非您的委托返回其他对象,否则令牌的表示对象是令牌字符串本身。

这应该可以解决你的问题:

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

答案 1 :(得分:2)

实际上,您首先必须定义一个标记字符,在您的情况下将是%

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

输入字符串也需要更改为:

  

胶水文字%[Tag]%其他胶水   文字%[另一个标签]%更多文字

...以便Cocoa知道令牌的结束位置。

如果您希望[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而不是令牌[Tag]。 / p>

如果有人能解决上述问题,我很乐意阅读。