【问题标题】:NSTokenField with mixed token/string input, possible?NSTokenField 与混合令牌/字符串输入,可能吗?
【发布时间】:2023-04-06 16:04:01
【问题描述】:

当在 Mail 的 NSTokenField 中输入无效电子邮件时,会得到以下信息(令牌纯字符串值):

有什么可推荐的方法来完成这个吗?
NSTokenField 甚至是正确的工具吗?还是我会滥用它?

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

现在我要求像这样输入输入:

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

我想将其更改为一些简单的图形解决方案,如下所示:

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

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

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

【问题讨论】:

    标签: objective-c cocoa nstokenfield


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      输入字符串也需要改成:

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

      ...这样 Cocoa 就知道令牌在哪里结束了。

      而如果想让[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: 并且复制/移动的标记将更改为常规文本标签而不是标记 [Tag]。

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

      【讨论】:

      • 你需要实现委托方法 - (BOOL)tokenField:(NSTokenField *)tokenField writeRepresentedObjects:(NSArray *)objects toPasteboard:(NSPasteboard *)pboard
      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多