代码之家  ›  专栏  ›  技术社区  ›  Regexident Amit Attias

可以使用混合令牌/字符串输入的NSTokenField吗?

  •  14
  • Regexident Amit Attias  · 技术社区  · 14 年前

    在邮件中输入无效电子邮件时 恩斯托克菲尔德 一个得到这个 混合代币 纯字符串值 ):

    alt text

    有什么可行的方法来完成这个任务吗?
    NSTokenField是不是合适的工具?或者我会滥用它?

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

    现在我要求输入如下:

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

    我想把这个改成这样一个简单的图形解决方案: alt text

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

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

    我确实读过苹果的NSTokenField指南,但找不到任何关于我的问题的信息。

    2 回复  |  直到 14 年前
        1
  •  12
  •   Sven    14 年前

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

    这对你的案子有好处:

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

    实际上,您首先必须定义一个标记化字符,在您的例子中是%

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

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

    粘合文本%[标记]%其他粘合 Text%[另一个标记]%More Text

    ... 好让可可知道代币的结尾。

    如果您希望[Tag]在token字段中显示为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: 并且复制/移动的标记将更改为常规文本标记,而不是标记[标记]。

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